2010-06-14

MFC, WinAPI i wersja systemu

WinAPI jest kompatybilne wstecz. Często powtarzana przez programistów Windows fraza, która generalnie jest prawdziwa. Są jednak pewne wyjątki, okazuje się, że nawet Microsoft robi spore zmiany we własnych headerach, co nieraz znacznie utrudnia utrzymanie kodu.
Dany jest kod. Kod ma prawie cztery lata, został napisany przy użyciu MFC i elementów Windows API do różnych funkcji systemowych. Oryginalne przeznaczenie: Windows XP. Wspomniany kod budowany był w sposób nieznany (wg. danych pliku solucji - za pomocą Visual C++ 2005 Express) na nieznanej kombinacji zainstalowanych i podpiętych SDK/API.

Przy kompilacji występują błędy: braki headerów i niepoprawne definicje. Pierwsze sprawdzenie: ścieżki do headerów i libów w ustawieniach solucji. Litery dysku przypisane na sztywno? Na szczęście ścieżki ustawione identycznie, z literami radzi sobie SUBST. Kilka błędów przechodzi, zostają niepoprawne definicje. Słowem przemilczę fakt, że wspomniane definicje są bez problemu znajdowane przez IDE.

Dalsze poszukiwania: sprawdzamy wszystko, co ma jakikolwiek związek z wersją kompilatora i SDK. Instalacja różnych wersji (w miarę obecnych), instalacja różny wersji IDE (Visual od 6.0 do 10.0 sprawdzone i przetestowane) nie pomaga. Masa szukania, kombinowania, wstępna decyzja o przepisaniu całości. Zostaje jedna prosta sprawa: w nagłówku zdefiniowane jest makro WINVER (oznaczające minimalną wersję Windows, na jakiej aplikacja ma działać). Wartość ustawiona na sztywno na Windows XP. Chwila przeglądania nagłówków... i okazuje się, że Microsoft zmienił minimalną wersję na Windows XP SP2. Zmiana jednej wartości - działa.

Stąd prośba i rada do wszystkich piszących kod pod Windows - dbajcie o dokumentowanie takich informacji jak data publikacji poszczególnych SDK, data ostatniej udanej kompilacji, ważne informacje dla innych programistów.

Brak komentarzy:

Prześlij komentarz