ŚCISŁA zgodność
Podczas włączania sprawdzania typów STRICT niektóre kompilowane kod źródłowy mogą generować komunikaty o błędach. W poniższych sekcjach opisano minimalne wymagania dotyczące kompilowania kodu po włączeniu STRICT. Zalecane są dodatkowe kroki, szczególnie w przypadku tworzenia przenośnego kodu.
Wymagania ogólne
Głównym wymaganiem jest zadeklarowanie poprawnych typów obsługi i wskaźników funkcji zamiast polegać na bardziej ogólnych typach. Nie można użyć jednego typu dojścia, w którym oczekiwano innego. Oznacza to również, że może być konieczne zmiana deklaracji funkcji i użycie większej liczby rzutów typów.
Aby uzyskać najlepsze wyniki, ogólny typ HANDLE powinien być używany tylko w razie potrzeby.
Deklarowanie funkcji w aplikacji
Upewnij się, że wszystkie funkcje aplikacji są zadeklarowane. Zalecane jest umieszczenie wszystkich deklaracji funkcji w pliku dołączania, ponieważ można łatwo skanować deklaracje i szukać parametrów i zwracanych typów, które należy zmienić.
Jeśli używasz opcji kompilatora /Zg, aby utworzyć pliki nagłówkowe dla funkcji, pamiętaj, że uzyskasz różne wyniki w zależności od tego, czy włączono sprawdzanie typów STRICT. Po wyłączeniu STRICT wszystkie typy obsługi generują ten sam typ podstawowy. Po włączeniu STRICT generują różne typy podstawowe. Aby uniknąć konfliktu, należy ponownie utworzyć plik nagłówka za każdym razem, gdy włączasz lub wyłączasz STRICTlub edytujesz plik nagłówka, aby używać typów HWND, hdc, HANDLEitd. zamiast typów podstawowych.
Wszelkie deklaracje funkcji skopiowane z pliku Windows.h do kodu źródłowego mogły ulec zmianie, a deklaracja lokalna może być nieaktualna. Usuń deklarację lokalną.
Typy wymagające rzutów
Niektóre funkcje mają ogólne typy zwracane lub parametry. Na przykład funkcja SendMessage zwraca dane, które mogą być dowolną liczbą typów, w zależności od kontekstu. Jeśli widzisz dowolną z tych funkcji w kodzie źródłowym, upewnij się, że używasz poprawnego rzutowania typu i że jest ona tak specyficzna, jak to możliwe. Poniższa lista jest przykładem tych funkcji.
- LocalLock
- GlobalLock
- GetWindowLong
- SetWindowLong
- SendMessage
- DefWindowProc
- SendDlgItemMessage
Podczas wywoływania SendMessage DefWindowProclub SendDlgItemMessagenależy najpierw rzutować wynik, aby wpisać UINT_PTR. Należy wykonać podobne kroki dla każdej funkcji zwracającej wartość LRESULT lub LONG_PTR, gdzie wynik zawiera uchwyt. Jest to konieczne do pisania kodu przenośnego, ponieważ rozmiar uchwytu różni się w zależności od wersji systemu Windows. Rzutowanie (UINT_PTR) zapewnia właściwą konwersję. Poniższy kod przedstawia przykład, w którym SendMessage zwraca uchwyt do pędzla:
HBRUSH hbr;
hbr = (HBRUSH)(UINT_PTR)SendMessage(hwnd, WM_CTLCOLOR, ..., ...);
createWindow and CreateWindowEx parametr hmenu jest czasami używany do przekazywania identyfikatora kontrolki całkowitej (ID). W takim przypadku należy rzutować identyfikator na typ HMENU:
HWND hwnd;
int id;
hwnd = CreateWindow(
TEXT("Button"), TEXT("OK"), BS_PUSHBUTTON,
x, y, cx, cy, hwndParent,
(HMENU)id, // Cast required here
hinst,
NULL);
Dodatkowe zagadnienia
Aby uzyskać największą korzyść z sprawdzania typów STRICT, należy przestrzegać dodatkowych wytycznych. Twój kod będzie bardziej przenośny w przyszłych wersjach systemu Windows, jeśli wprowadzisz następujące zmiany.
Typy WPARAM, LPARAM, LRESULTi LPVOID są typy danych polimorficznych. Przechowują różne rodzaje danych w różnych momentach, nawet jeśli jest włączona funkcja sprawdzania typów STRICT. Aby uzyskać korzyści z sprawdzania typów, należy rzutować wartości tych typów tak szybko, jak to możliwe. (Należy pamiętać, że krakersy komunikatów automatycznie recast wParam i lParam dla Ciebie w przenośny sposób).
Należy zachować szczególną ostrożność, aby odróżnić HMODULE i HINSTANCE typów. Nawet w przypadku włączenia STRICT są one zdefiniowane jako ten sam typ podstawowy. Większość funkcji zarządzania modułami jądra używa typów HINSTANCE, ale istnieje kilka funkcji, które zwracają lub akceptują tylko typy HMODULE.
Tematy pokrewne
-
wyłączanie STRICT
-
włączanie STRICT