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łanieSetWindowPos()
powodujące wysłanieWM_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łączaDEVICE_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. UstawienieDEVICE_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 komunikatuWM_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 flagiGEM_NODISCARD
przekazanej doGlobalAlloc() 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łaniachGlobalAlloc()
, 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 przezGetUpdateRect()
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 potomnymiWS_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 ustawiaDEVICE_FONTTYPE
dla wszystkich czcionek TrueType, które są wyliczane za pomocą interfejsu API systemu WindowsEnumFont()
. 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
- Zestaw zasobów systemu Microsoft Windows 95 . Microsoft Press. 1995. s. 718 i nast. ISBN 978-1-55615-678-6 .
- „MKCOMPAT sprawia, że stare programy zachowują się” . Inteligentne przetwarzanie . Tom. 8, nie. 7. Wydawnictwo Sandhills. lipiec 1997 r.
- „Jak korzystać z programu Mkcompat.exe dla programów opartych na systemie Windows 3.1” . Baza wiedzy firmy Microsoft . 1.2. Microsoftu . 20 stycznia 2007 r. KID 173086.
- „Sekcja WIN.INI [Zgodność]” . Baza wiedzy firmy Microsoft . 1.0. Microsoftu . 25 grudnia 2000 r. KID 82860.