Spraw, aby był kompatybilny

Spraw, aby był kompatybilny
Deweloperzy Microsoftu
System operacyjny Windowsa 9x

Make Compatible to program opracowany przez firmę Microsoft , który jest dołączony do systemów operacyjnych Windows 9x . Zmienia ustawienia systemowe poszczególnych programów w systemie Windows, aby umożliwić uruchamianie programów systemu Windows 3.1 , które są specjalnie dostosowane do tej platformy, w nowszych wersjach. Nazwa pliku obrazu programu dla narzędzia Make Compatible to mkcompat.exe i jest on przechowywany w katalogu \Windows\System .

Opcje

Po wywołaniu można wybrać nazwę pliku obrazu programu aplikacji Windows 3.1 za pomocą opcji „Wybierz program” w menu „Plik”. Po wybraniu pliku obrazu programu funkcja Dostosuj domyślnie wyświetla listę pięciu opcji, które można ustawić w celu zmiany zachowania systemu Windows dla tego programu podczas jego wykonywania:

  • Nie buforuj do ulepszonych plików meta
  • Daj aplikacji więcej miejsca na stosie
  • Kłam na temat rozmiaru trybu drukarki
  • Kłam na temat numeru wersji systemu Windows
  • Sterowanie w stylu Windows 3.1

Tryb opcji zaawansowanych, wybierany za pomocą opcji „Opcje zaawansowane” w menu „Plik”, przedstawia dłuższą listę opcji, umożliwiając dokładniejszą kontrolę emulacji systemu Windows 3.1, jeśli wymaga tego dana aplikacja.

Bity kompatybilności

Każda z opcji zapisywana jest w systemowej bazie danych tzw. „bitów zgodności”. To jest baza danych zawierająca 1-bitowe flagi, po jednej dla każdej opcji wyświetlanej przez Make Compatible.

Ta baza danych istniała już we wcześniejszych wersjach systemu Windows. W systemie Windows 3.1 baza danych jest przechowywana w [Compatibility] pliku win.ini z wpisami takimi jak:



 [Kompatybilność]  ACAD  =  0x8000  AMIPRO  =  0x04000010 

Każda linia zawiera nazwę programu użytkowego i podaje szesnastkową stałą liczbową, którą należy skojarzyć z tym programem. Szesnastkowa stała numeryczna koduje flagi bitowe zgodności dla tej konkretnej aplikacji, które system Windows stosuje podczas wykonywania aplikacji. Make Compatible zapewnia jedynie graficzny interfejs użytkownika do łatwej edycji tych flag, zamiast ręcznego edytowania pliku win.ini za pomocą edytora tekstu. Pozwala na ustawianie i rozbrajanie poszczególnych flag bez konieczności znajomości ich wartości liczbowych.

Flagi bitowe zgodności, które można ustawić w pliku win.ini , nie są udokumentowane w pliku WININI.WRI dostarczanym z systemem Windows 3.1 ani w zestawie Microsoft Windows 3.1 Resource Kit opublikowanym przez firmę Microsoft. Są one wymienione jako prosty zestaw zdefiniowanych stałych (z nazwami zaczynającymi się od „GACF_” dla „GetAppCompatFlags”), bez wyjaśnienia, w pliku nagłówkowym windows.h który jest dostarczany z zestawem programistycznym sterowników urządzeń dla systemu Microsoft Windows 3.1. W systemie Windows 3.1 flagi zgodności obowiązujące dla dowolnego zadania w bazie danych zadań jądra można odczytać za pomocą nieudokumentowanej GetAppCompatFlags() , która jest eksportowana z modułu KERNEL .

Flagi trybu zaawansowanego

Flagi są udokumentowane w artykule bazy wiedzy Microsoft KnowledgeBase nr 82860. Odpowiadają one flagom „trybu zaawansowanego”, które można ustawić w menu „Opcje zaawansowane” Make Compatible:

30 metryk średniej szerokości
Jest to bit nr 19 słowa bitów zgodności o wartości szesnastkowej 0x80000 , znany pod symboliczną nazwą GACF_30AVGWIDTH w pliku windows.h . Ta flaga powoduje, że system Windows ponownie skaluje wszystkie czcionki o współczynnik podczas obliczania ich średniej szerokości znaków. Powodem tego jest to, że jedna konkretna aplikacja Windows 3.0, TurboTax , zakodowała na stałe wartości, których używała do takich obliczeń rozmiaru, co nie działało poprawnie z nowym TrueType -kompatybilna metoda obliczania średniej szerokości czcionki stosowana w systemie Windows 3.1. Uniemożliwiło to ludziom używanie TurboTax do drukowania podatkowych na drukarkach PostScript .
Zawsze wysyłaj NC_Paint
Jest to bit nr 6 słowa bitów zgodności o wartości szesnastkowej 0x40 , znany pod symboliczną nazwą GACF_ALWAYSSENDNCPAINT w windows.h . Ta flaga wymusza każde wywołanie SetWindowPos() powodujące wysłanie WM_NCPAINT wiadomość do wszystkich okien potomnych. To jest zachowanie systemu Windows 3.0. W systemie Windows 3.1 zachowanie zostało zmienione w taki sposób, że komunikat okna jest wysyłany tylko do tych okien, które wymagają odświeżenia obszarów nieklienckich. Jednak niektóre aplikacje systemu Windows 3.0 polegały na tym, że zawsze otrzymywały ten komunikat, aby określić, czy okna podrzędne wymagają zmiany położenia.
Nie wyliczaj czcionek urządzenia
To jest bit nr 14 słowa bitów zgodności o wartości szesnastkowej 0x2000 , znany pod symboliczną nazwą GACF_ENUMTTNOTDEVICE w windows.h . Ta flaga powoduje, że Windows 3.1 włącza DEVICE_FONTTYPE jest wyłączana w określonych okolicznościach, gdy aplikacja, która chce drukować, wylicza czcionki. Szczególne okoliczności występują, gdy drukarka docelowa nie jest ani drukarką igłową , ani drukarką PostScript, a czcionki są czcionkami TrueType, które nie są rezydujące w samej drukarce. W takich okolicznościach niektóre aplikacje (w tym PageMaker i MGXDraw) błędnie interpretują flagę i uważają, że czcionka jest rezydująca na urządzeniu. (Czcionki TrueType mogą być przesyłane przez system Windows do drukarek i nie muszą być rezydowane na samym urządzeniu, aby można było z nich korzystać). Następnie wysyłają do drukarki zapytanie, jakie rozmiary czcionek obsługuje, a kiedy to się nie powiedzie (ponieważ drukarka nie nie wiedzą o czcionce, dopóki nie zostanie przesłana), błędnie zakładają, że nie można zmienić rozmiaru czcionki. Ustawienie DEVICE_FONTTYPE na false w takich sytuacjach zapobiega błędom aplikacji i właśnie to robi ta flaga bitowa zgodności.
Nie wysyłaj calcsize WM_MOVE
To jest bit nr 17 słowa bitów zgodności o wartości szesnastkowej 0x20000 , znanej pod symboliczną nazwą GACF_NCCALCSIZEONMOVE w windows.h . Ta flaga wymusza wysłanie komunikatu WM_NCCALCSIZE do okna, które jest przenoszone lub którego rozmiar jest zmieniany. To jest zachowanie systemu Windows 3.0. W systemie Windows 3.1 zachowanie zostało zmienione, aby komunikat okna był wysyłany tylko do tych okien, których rozmiar był zmieniany. Nie został wysłany, jeśli okno zostało tylko przesunięte. Jednak niektóre aplikacje Windows 3.0, takie jak Lotus Notes na przykład polegał na tym, że zawsze otrzyma tę wiadomość.
Czcionki Enum Helv i Times Roman
Jest to bit nr 12 słowa bitów zgodności o wartości szesnastkowej 0x1000 , znany pod symboliczną nazwą GACF_ENUMHELVNTMSRMN w windows.h . Ta flaga rozwiązuje problem z aplikacjami, które odmawiały poprawnego działania, chyba że czcionki o dokładnych nazwach „Helv” i „Tms Rmn” zostały wymienione jako obecne w systemie przez interfejs API wyliczania czcionek systemu Windows. Nazwy są znakami towarowymi firmy Linotype dla poszczególnych czcionek, Helvetica i Times Roman , a ponieważ Microsoft nie dostarczył tych czcionek Linotype z systemem Windows 3.1, nie mógł ich wyliczyć jako obecnych. Ta flaga powoduje, że system Windows wylicza czcionki „MS Sans Serif” i „MS Serif” pod nazwami „Helv” i „Tms Rmn”, aby zapewnić zgodność z aplikacjami, które nie działają bez użycia tych dokładnych nazw.
Wymuś dodatkowe słowa systemu Windows
To jest bit nr 8 słowa bitów zgodności, o wartości szesnastkowej 0x100 , znany pod symboliczną nazwą GACF_MOREEXTRAWNDWORDS w windows.h . Ta flaga rozwiązuje problem z aplikacjami, które zakładały istnienie słów okna (dodatkowe elementy danych skojarzone przez system Windows z oknami GUI), podczas gdy w rzeczywistości nie poinformowały systemu Windows, że wymagane są dodatkowe słowa okna. Windows 3.1, w przeciwieństwie do Windows 3.0, ogranicza wszystkie zastosowania dodatkowych słów okiennych, a aplikacje, które zakładały, że mogą wykorzystać więcej miejsca, niż prosiły, kończyłyby się niepowodzeniem. W przypadku aplikacji uruchamianych z tą ustawioną flagą system Windows 3.1 po cichu zwiększał całkowitą liczbę słów żądanych przez aplikację o dodatkowe 4 bajty.
Wymuś tekst drukarki do nowego pasma
Jest to bit nr 1 słowa bitów zgodności o wartości szesnastkowej 0x2 , znany pod symboliczną nazwą GACF_FORCETEXTBAND w windows.h . Ta flaga powoduje, że system Windows 3.1 zawsze używa dwóch pasm podczas drukowania, pierwszego dla grafiki, a drugiego dla tekstu. Zwykle Windows 3.1 próbuje drukować oba w jednym paśmie. Ale aplikacje takie jak WordPerfect zakładały, że zawsze będzie istniał drugi pasek i zawsze będzie tam, gdzie był tekst, tak jak miało to miejsce w Windows 3.0. Freelance Graphics miał podobny problem.
Wymuś czcionki TT na pasku grafiki
To jest bit nr 15 słowa bitów zgodności o wartości szesnastkowej 0x8000 , znanej pod symboliczną nazwą GACF_FORCETTGRAPHICS w windows.h . Ta flaga miała na celu obejście problemu z Freelance Graphics , gdzie nie można było drukować przy użyciu czcionek TrueType, chyba że były one drukowane jako grafika.
Globalne haki wywoływane tylko dla aplikacji Win16
Ignoruj ​​odrzucalne atrybuty segmentu
To jest bit nr 0 słowa bitów zgodności, z wartością szesnastkową 0x1 , znany pod symboliczną nazwą GACF_IGNORENODISCARD w windows.h . Ta flaga wymusza ignorowanie flagi GEM_NODISCARD przekazanej do GlobalAlloc() przez program. Udało się obejść błąd w bibliotece uruchomieniowej dostarczanej z własnym kompilatorem C firmy Microsoft, Microsoft C w wersji 6. Biblioteka uruchomieniowa błędnie ustawiała tę flagę w wywołaniach GlobalAlloc() , a każda aplikacja skompilowana z tym kompilatorem wyświetlałaby w ten sposób zachowanie.
Ignoruj ​​czcionki rastrowe
Jest to bit nr 9 słowa bitów zgodności, o wartości szesnastkowej 0x200 , znany pod symboliczną nazwą GACF_TTIGNORERASTERDUPE w windows.h . Ta flaga zapobiega wyliczaniu czcionek o tych samych rozmiarach jako czcionek bitmapowych i czcionek TrueType. Stało się tak, ponieważ kilka aplikacji, w tym WordPerfect i Visual Basic , nie było w stanie poprawnie obsłużyć tej konkretnej sytuacji.
Ignoruj ​​najwyższe okna
Jest to bit nr 3 słowa bitów zgodności o wartości szesnastkowej 0x8 , znany pod symboliczną nazwą GACF_IGNORETOPMOST w windows.h . Ta flaga rozwiązuje konkretny problem z cc:Mail co spowodowało awarię w systemie Windows 3.1. Założono, że dostęp do pierwszego okna za pomocą GetWindow(HWND,GW_HWND_FIRST) zwróci okno aplikacji, którą właśnie uruchomiono za pomocą WinExec() . Ale w systemie Windows 3.1, który wprowadził ideę „najwyższych” okien, nie było to już prawdą. Flaga powodowała, że ​​system Windows 3.1 pomijał najwyższe okna, gdy wysyłano to konkretne żądanie API.
Hack specyficzny dla modułu
nr HRGN 1
Jest to bit nr 16 słowa bitów zgodności o wartości szesnastkowej 0x10000 , znany pod symboliczną nazwą GACF_NOHRGN1 w windows.h . Ta flaga przywraca błąd występujący w systemie Windows 3.0, który został naprawiony w systemie Windows 3.1. Stało się tak, ponieważ kilka aplikacji, takich jak Microsoft Draw, samo obeszło błąd i przestało działać poprawnie, gdy błąd został wyeliminowany. Błąd polegał na błędzie w wartości zwracanej przez GetUpdateRect() funkcja, dzięki której w pewnych sytuacjach (gdy całe okno było nieprawidłowe) zwracałaby współrzędne prostokąta aktualizacji we współrzędnych okna, a nie we współrzędnych logicznych, jak powinna. W systemie Windows 3.1 zawsze zwracał prostokąt aktualizacji we współrzędnych logicznych. Aplikacje, które obeszły błąd, wykonywały transformację współrzędnych, aby obejść błąd, i ostatecznie aktualizowały niewłaściwe części swoich okien w systemie Windows 3.1.
Jedno pasmo graficzne i użyj znaków ucieczki
To jest bit nr 2 słowa bitów kompatybilności, o wartości szesnastkowej 0x4 , znany pod nazwą symboliczną GACF_ONELANDGRXBAND w windows.h . Ta flaga powoduje, że system Windows 3.1 używa pojedynczego pasma grafiki podczas drukowania w trybie poziomym , zużywając tyle pamięci, ile potrzeba dla tego pasma, i odrzucając zawartość, która nie mieści się w paśmie.
Odejmowanie rodzeństwa klipów
Jest to bit nr 14 słowa bitów zgodności o wartości szesnastkowej 0x4000 , znany pod symboliczną nazwą GACF_SUBTRACTCLIPSIBS w windows.h . Ta flaga powoduje, że Windows 3.1 inaczej obsługuje unieważnianie okien dla okien najwyższego poziomu, które nie mają WS_CLIPSIBLINGS i ich okna podrzędne. (Innymi słowy: wpływa na okna dialogowe i kontrolki na nich.) Z ustawioną flagą Windows nie będzie unieważniał równorzędnych okien potomnych znajdujących się pod (w kolejności z) innymi oknami potomnymi WS_CLIPSIBLINGS . Głównym powodem flagi były aplikacje, takie jak Lotus Notes 2.1, który zaimplementował własne pola kombi jako okna podrzędne, a nie jako okna najwyższego poziomu (domyślna systemowa implementacja pola kombi). Po ustawieniu tej flagi zniknęłyby dziwne problemy z wyświetlaniem takich okien.
Obsługa wielu pasm druku
To jest bit nr 5 słowa bitów zgodności o wartości szesnastkowej 0x20 , znany pod symboliczną nazwą GACF_MULTIPLEBANDS w windows.h . Ta flaga powoduje, że system Windows 3.1 zawsze używa wielu pasm do drukowania, nawet jeśli jeden pasek byłby wystarczający. Miało to na celu obejście problemu w Freelance Graphics, który zakładałby, że gdyby istniał tylko jeden pasek i był to cała strona, był to pasek tekstowy i nawet nie próbowałby drukować grafiki. W systemie Windows 3.1 uniwersalny sterownik drukarki byłby czasami w stanie obsłużyć zarówno tekst, jak i grafikę za pomocą jednego pasma. Wymuszanie używania wielu pasm pozwoliło uniknąć problemów, jakie mogłoby to spowodować dla Freelance Graphics.
Czcionki TT są czcionkami urządzenia
To jest bit nr 4 słowa bitów zgodności, z wartością szesnastkową 0x10 , znany pod symboliczną nazwą GACF_CALLTTDEVICE w windows.h . Ta flaga powoduje, że system Windows 3.1 zawsze ustawia DEVICE_FONTTYPE dla wszystkich czcionek TrueType, które są wyliczane za pomocą interfejsu API systemu Windows EnumFont() . Miało to rozwiązać problem z aplikacjami, w tym AmiPro i WordPerfect, które zakładały, że wszystkie czcionki TrueType dostępne na drukarce będą rezydentami urządzenia.
Zachowanie palety Windows 3.1

Dodatkowe flagi

Windows 3.1 zdefiniował 20 flag kompatybilności aplikacji. Windows 95 i 98 zdefiniowały kolejne 11 flag, nieudokumentowanych w artykule Bazy wiedzy i nieprzypisanych symbolicznych stałych nazw w windows.h , które są pozostałymi opcjami dostępnymi za pośrednictwem menu „Opcje zaawansowane” w Make Compatible:

Wyłącz pamięć podręczną 16 pędzli kolorów i zegar 55 ms
To jest bit nr 29 słowa bitów zgodności, z wartością szesnastkową 0x20000000 .
Wyłącz buforowanie EMF
Jest to bit nr 26 słowa bitów zgodności, o wartości szesnastkowej 0x4000000 .
Wyłącz skojarzenia czcionek
Jest to bit nr 24 słowa bitów zgodności o wartości szesnastkowej 0x1000000 .
Nie dołączaj wątku wejściowego podczas kronikowania, SetActiveWindow == SetForeGroundWindow
To jest bit #28 słowa bitów zgodności, z wartością szesnastkową 0x10000000 .
Nie zamykaj/Ignoruj ​​niektóre błędy/linia poleceń dequote
To jest bit nr 25 słowa bitów zgodności, z wartością szesnastkową 0x2000000 .
Włącz funkcje interfejsu użytkownika 3.x
To jest bit nr 27 słowa bitów zgodności z wartością szesnastkową 0x8000000 .
Wymuś rozmiar trybu deweloperskiego drukarki Win31
Jest to bit nr 23 słowa bitów zgodności, z wartością szesnastkową 0x800000 .
Zwiększ rozmiar stosu
To jest bit nr 22 słowa bitów zgodności, o wartości szesnastkowej 0x400000 .
Kłamstwo na temat limitów urządzeń/brak sprawdzania poprawności SetDIBits
To jest bit nr 20 słowa bitów zgodności, z wartością szesnastkową 0x100000 .
Kłamstwo na temat wersji systemu Windows
To jest bit nr 21 słowa bitów zgodności, o wartości szesnastkowej 0x200000 .
Lustrzane czcionki w win.ini
To jest bit nr 30 słowa bitów zgodności, z wartością szesnastkową 0x40000000 .

Dalsza lektura