Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Als u niet in Windows-programmering bent, kan dit verwarrend zijn wanneer u voor het eerst een Windows-programma ziet. De code wordt gevuld met vreemde typedefinities zoals DWORD_PTR en LPRECT-, en variabelen hebben namen zoals hWnd en pwsz (hongaarse notatie genoemd). Het is de moeite waard om enkele van de Windows-coderingsconventies te leren.
De overgrote meerderheid van Windows-API's bestaat uit ofwel functies of Component Object Model (COM) interfaces. Er zijn weinig Windows-API's beschikbaar als C++-klassen. (Een opvallende uitzondering is GDI+, een van de 2D-grafische API's.)
Typedefs
De Windows headers bevatten heel veel typedefs. Veel van deze zijn gedefinieerd in het headerbestand WinDef.h. Hier volgen enkele die je vaak zult tegenkomen.
Gehele getaltypen
| Gegevenstype | Grootte | Ondertekend? |
|---|---|---|
| BYTE | 8 bits | Niet ondertekend |
| DWORD | 32 bits | Ongesigneerd |
| INT32 | 32 bits | Ondertekend |
| INT64 | 64 bits | Ondertekend |
| LONG- | 32 bits | Ondertekend |
| LONGLONG | 64 bits | Ondertekend |
| UINT32 | 32 bits | Ongesigneerd |
| UINT64- | 64 bits | Ongesigneerd |
| ULONG- | 32 bits | Niet ondertekend |
| ULONGLONG | 64 bits | Niet ondertekend |
| WORD | 16 bits | Ongesigneerd |
Zoals u kunt zien, is er een bepaalde hoeveelheid redundantie in deze typedefs. Sommige van deze overlappingen zijn simpelweg te wijten aan de geschiedenis van de Windows-API's. De typen die hier worden vermeld, hebben een vaste grootte en de grootten zijn hetzelfde in zowel 32-bits als 64-toepassingen. Het DWORD- type is bijvoorbeeld altijd 32 bits breed.
Booleaanse type
BOOL- is een typealias voor int, gescheiden van de bool-van C++, en van andere typen die een booleaanse-waarde vertegenwoordigen. Het headerbestand WinDef.h definieert ook twee waarden voor gebruik met BOOL-.
#define FALSE 0
#define TRUE 1
Ondanks deze definitie van TRUE, kunnen de meeste functies die een BOOL type retourneren, elke waarde die niet nul is gebruiken om een ware waarde in Bool aan te geven. Daarom moet u altijd dit schrijven:
// Right way.
if (SomeFunctionThatReturnsBoolean())
{
...
}
// or
if (SomeFunctionThatReturnsBoolean() != FALSE)
{
...
}
en niet dit:
if (result == TRUE) // Wrong!
{
...
}
BOOL- is een geheel getal en is niet uitwisselbaar met de bool-van C++.
Aanwijzertypen
Windows definieert veel gegevenstypen van het formulier pointer-to-X-. Deze hebben meestal het voorvoegsel P- of LP- in de naam. LPRECT- is bijvoorbeeld een aanwijzer naar een RECT-, waarbij RECT- een structuur is die een rechthoek beschrijft. De volgende variabeledeclaraties zijn equivalent.
RECT* rect; // Pointer to a RECT structure.
LPRECT rect; // The same
PRECT rect; // Also the same.
Op 16-bits architecturen (16-bits Windows) zijn er twee typen aanwijzers, P- voor 'aanwijzer' en LP- staat voor 'lange aanwijzer'. Lange aanwijzers (ook wel far pointersgenoemd) waren nodig om geheugenbereiken buiten het huidige segment aan te pakken. Het LP--voorvoegsel is behouden, zodat u eenvoudiger 16-bits code kunt overzetten naar 32-bits Windows. Tegenwoordig is er geen onderscheid en deze aanwijzertypen zijn allemaal gelijkwaardig. Vermijd het gebruik van deze voorvoegsels; of als u er een moet gebruiken, gebruikt u P.
Precisietypen voor aanwijzers
De volgende gegevenstypen zijn altijd de grootte van een aanwijzer: 32 bits breed in 32-bits toepassingen en 64 bits breed in 64-bits toepassingen. De grootte wordt tijdens het compileren bepaald. Wanneer een 32-bits toepassing wordt uitgevoerd op 64-bits Windows, zijn deze gegevenstypen nog steeds 4 bytes breed. (Een 64-bits toepassing kan niet worden uitgevoerd op 32-bits Windows, dus de omgekeerde situatie treedt niet op.)
- DWORD_PTR
- INT_PTR
- LONG_PTR
- ULONG_PTR
- UINT_PTR
Deze typen worden gebruikt in situaties waarin een geheel getal kan worden omgezet in een aanwijzer. Ze worden ook gebruikt om variabelen te definiƫren voor pointer-aritmetica en om lus-tellers te definiƫren die het volledige bereik van bytes in geheugenbuffers doorlopen. Over het algemeen worden ze weergegeven op plaatsen waar een bestaande 32-bits waarde is uitgebreid naar 64 bits op 64-bits Windows.
Hongaarse notatie
Hongaarse notatie is de praktijk van het toevoegen van voorvoegsels aan de namen van variabelen, om aanvullende informatie over de variabele te geven. (De uitvinder van de notatie, Charles Simonyi, was Hongaars, vandaar de naam).
In de oorspronkelijke vorm geeft Hongaarse notatie semantische informatie over een variabele, waardoor je het beoogde gebruik kunt afleiden.
i betekent bijvoorbeeld een index, cb een grootte in bytes ("aantal bytes"), en rw en col betekenen rij- en kolomnummers. Deze voorvoegsels zijn ontworpen om onbedoeld gebruik van een variabele in de verkeerde context te voorkomen. Als u bijvoorbeeld de expressie hebt gezien rwPosition + cbTable, weet u dat een rijnummer wordt toegevoegd aan een grootte, wat vrijwel zeker een fout in de code is
Een meer algemene vorm van Hongaarse notatie maakt gebruik van voorvoegsels om type informatie te geven, bijvoorbeeld dw- voor DWORD- en w voor WORD-.
Notitie
De C++-basisrichtlijnen voorvoegsel notatie (bijvoorbeeld Hongaarse notatie) ontmoedigen. Zie NL.5: Vermijd informatie over encoderingstypes in namen. Intern gebruikt het Windows-team het niet meer. Maar het gebruik blijft beperkt tot voorbeelden en documentatie.