SZIGORÚ megfelelőség
A sikeresen lefordított forráskódok hibaüzeneteket eredményezhetnek SZIGORÚ típusellenőrzés engedélyezésekor. A következő szakaszok ismertetik a kód fordításának minimális követelményeit SZIGORÚ engedélyezése esetén. További lépések ajánlottak, különösen a hordozható kód előállításához.
Általános követelmények
A fő követelmény az, hogy az általánosabb típusok helyett a megfelelő leírótípusokat és függvénymutatókat kell deklarálnia. Nem használhat olyan leírótípust, ahol egy másikat várnak. Ez azt is jelenti, hogy módosítania kell a függvénydeklarációkat, és több típust kell használnia.
A legjobb eredmény érdekében az általános HANDLE típus csak akkor használható, ha szükséges.
Függvények deklarálása az alkalmazásban
Győződjön meg arról, hogy az összes alkalmazásfüggvény deklarálva van. Az összes függvénydeklaráció belefoglalási fájlba helyezése ajánlott, mert egyszerűen beolvashatja a deklarációkat, és megkeresheti a módosítandó paraméter- és visszatérési típusokat.
Ha a /Zg fordítóval hoz létre fejlécfájlokat a függvényekhez, ne feledje, hogy különböző eredményeket fog kapni attól függően, hogy engedélyezte-e SZIGORÚ típusellenőrzést. Ha SZIGORÚ le van tiltva, minden leírótípus ugyanazt az alaptípust hozza létre. Ha engedélyezve van SZIGORÚ, különböző alaptípusokat hoznak létre. Az ütközés elkerülése érdekében minden alkalommal újra létre kell hoznia a fejlécfájlt, amikor engedélyezi vagy letiltja SZIGORÚ, vagy szerkesztenie kell a fejlécfájlt a HWND , HDC, HANDLEstb. helyett.
Előfordulhat, hogy a Windows.h-ból a forráskódba másolt függvénydeklarációk módosultak, és előfordulhat, hogy a helyi deklaráció elavult. Távolítsa el a helyi deklarációt.
Olyan típusok, amelyekhez cast-eket kell igényelni
Egyes függvények általános visszatérési típusokkal vagy paraméterekkel rendelkeznek. A SendMessage függvény például a környezettől függően tetszőleges számú adatot ad vissza. Ha ezek közül bármelyik függvény megjelenik a forráskódban, győződjön meg arról, hogy a megfelelő típusbeosztást használja, és hogy az a lehető legrészletesebb legyen. Az alábbi lista egy példa ezekre a függvényekre.
Amikor meghívja SendMessage, DefWindowProcvagy SendDlgItemMessage, először az eredményt a UINT_PTRbeírására kell leadnia. Hasonló lépéseket kell végrehajtania minden olyan függvény esetében, amely LRESULT vagy LONG_PTR értéket ad vissza, ahol az eredmény egy leírót tartalmaz. Ez hordozható kód írásához szükséges, mert a leíró mérete a Windows verziójától függően eltérő. A (UINT_PTR) öntött biztosítja a megfelelő átalakítást. Az alábbi kód egy példát mutat be, amelyben SendMessage egy fogópontot ad vissza egy ecsetnek:
HBRUSH hbr;
hbr = (HBRUSH)(UINT_PTR)SendMessage(hwnd, WM_CTLCOLOR, ..., ...);
A CreateWindow és CreateWindowEx paraméter hmenu néha egész szám vezérlőelem-azonosító (ID) átadására szolgál. Ebben az esetben az azonosítót egy HMENU típusra kell leadnia:
HWND hwnd;
int id;
hwnd = CreateWindow(
TEXT("Button"), TEXT("OK"), BS_PUSHBUTTON,
x, y, cx, cy, hwndParent,
(HMENU)id, // Cast required here
hinst,
NULL);
További szempontok
A SZIGORÚ típusellenőrzés előnyeinek kihasználásához további irányelveket kell követnie. A kód hordozhatóbb lesz a Windows későbbi verzióiban, ha az alábbi módosításokat hajtja végre.
A WPARAM, LPARAM, LRESULTés LPVOIDpolimorf adattípusok. Különböző típusú adatokat tárolnak különböző időpontokban, még akkor is, ha SZIGORÚ típusellenőrzés engedélyezve van. A típusellenőrzés előnyeinek eléréséhez a lehető leghamarabb el kell helyeznie az ilyen típusú értékeket. (Vegye figyelembe, hogy az üzenetkreplikátorok automatikusan átkoncast wParam és lParam az Ön számára hordozható módon.)
Ügyeljen arra, hogy megkülönböztetje HMODULE és HINSTANCE típusokat. Még ha SZIGORÚ is engedélyezve van, azonos alaptípusként vannak definiálva. A legtöbb kernelmodul-felügyeleti függvény HINSTANCE típusokat használ, de van néhány függvény, amely csak HMODULE típusokat ad vissza vagy fogad el.
Kapcsolódó témakörök