STRIKTE naleving
Sommige broncode die wordt gecompileerd, kan foutberichten opleveren wanneer u STRICT typecontrole inschakelt. In de volgende secties worden de minimale vereisten beschreven voor het compileren van uw code wanneer STRICT- is ingeschakeld. Aanvullende stappen worden aanbevolen, met name voor het produceren van draagbare code.
Algemene vereisten
De belangrijkste vereiste is dat u de juiste handletypen en functiepointers moet declareren in plaats van te vertrouwen op meer algemene typen. U kunt het ene ingangstype niet gebruiken waar een andere wordt verwacht. Dit betekent ook dat u functiedeclaraties moet wijzigen en meer typecasts moet gebruiken.
Voor de beste resultaten moet het algemene HANDLE--type alleen worden gebruikt wanneer dat nodig is.
Functies declareren binnen uw toepassing
Zorg ervoor dat alle toepassingsfuncties zijn gedeclareerd. Het is raadzaam om alle functiedeclaraties in een include-bestand te plaatsen, omdat u uw declaraties eenvoudig kunt scannen en kunt zoeken naar parameter- en retourtypen die moeten worden gewijzigd.
Als u de optie /Zg compiler gebruikt om headerbestanden voor uw functies te maken, moet u er rekening mee houden dat u verschillende resultaten krijgt, afhankelijk van of u STRICT typecontrole hebt ingeschakeld. Als STRICT uitgeschakeld, genereren alle handletypen hetzelfde basistype. Als STRICT ingeschakeld, genereren ze verschillende basistypen. Als u conflicten wilt voorkomen, moet u het headerbestand telkens opnieuw maken wanneer u STRICT-inschakelt of uitschakelt, of het headerbestand bewerken om de typen HWND-te gebruiken, HDC-, HANDLE-enzovoort, in plaats van de basistypen.
Eventuele functiedeclaraties die u uit Windows.h naar uw broncode hebt gekopieerd, zijn mogelijk gewijzigd en uw lokale declaratie is mogelijk verouderd. Verwijder uw lokale declaratie.
Typen waarvoor casts zijn vereist
Sommige functies hebben algemene retourtypen of parameters. De functie SendMessage retourneert bijvoorbeeld gegevens die mogelijk een willekeurig aantal typen zijn, afhankelijk van de context. Wanneer u een van deze functies in uw broncode ziet, moet u ervoor zorgen dat u het juiste type cast gebruikt en dat deze zo specifiek mogelijk is. De volgende lijst is een voorbeeld van deze functies.
Wanneer u SendMessageaanroept, DefWindowProcof SendDlgItemMessage, moet u eerst het resultaat casten om UINT_PTRte typen. U moet vergelijkbare stappen uitvoeren voor elke functie die een LRESULT- of LONG_PTR waarde retourneert, waarbij het resultaat een ingang bevat. Dit is nodig voor het schrijven van draagbare code omdat de grootte van een ingang varieert, afhankelijk van de versie van Windows. De cast (UINT_PTR) zorgt voor de juiste conversie. De volgende code toont een voorbeeld waarin SendMessage- een ingang retourneert naar een kwast:
HBRUSH hbr;
hbr = (HBRUSH)(UINT_PTR)SendMessage(hwnd, WM_CTLCOLOR, ..., ...);
De parameter CreateWindow en CreateWindowEx parameter hmenu wordt soms gebruikt om een geheel getal-id (ID) door te geven. In dit geval moet u de id casten naar een HMENU type:
HWND hwnd;
int id;
hwnd = CreateWindow(
TEXT("Button"), TEXT("OK"), BS_PUSHBUTTON,
x, y, cx, cy, hwndParent,
(HMENU)id, // Cast required here
hinst,
NULL);
Aanvullende overwegingen
Om optimaal te profiteren van STRICT typecontrole, zijn er aanvullende richtlijnen die u moet volgen. Uw code is in toekomstige versies van Windows meer draagbaar als u de volgende wijzigingen aanbrengt.
De typen WPARAM, LPARAM, LRESULTen LPVOID- zijn polymorfe gegevenstypen. Ze bevatten verschillende soorten gegevens op verschillende momenten, zelfs wanneer STRICT typecontrole is ingeschakeld. Om het voordeel van typecontrole te krijgen, moet u zo snel mogelijk waarden van deze typen casten. (Houd er rekening mee dat berichtkrakers automatisch opnieuw worden gecast wParam en lParam op een draagbare manier.)
Let er vooral op dat u HMODULE- en -typen VAN HINSTANCE kunt onderscheiden. Zelfs als STRICT ingeschakeld, worden ze gedefinieerd als hetzelfde basistype. De meeste kernelmodulebeheerfuncties gebruiken HINSTANCE- typen, maar er zijn enkele functies die alleen HMODULE- typen retourneren of accepteren.
Verwante onderwerpen