Zoeken…


Invoering

De Windows API-documentatie voor functies die een of meer tekenreeksen als argument gebruiken, ziet er meestal als volgt uit:

BOOL WINAPI CopyFile(
  _In_ LPCTSTR lpExistingFileName,
  _In_ LPCTSTR lpNewFileName,
  _In_ BOOL    bFailIfExists
);

Het gegevenstype voor de twee stringparameters bestaat uit verschillende delen:

  • LP = Lange wijzer
  • C = const
  • T = TCHAR
  • STR = string

Wat betekent TCHAR ? Dit is afhankelijk van het gekozen platform voor de compilatie van het programma.

CopyFile zelf is slechts een macro, zoiets gedefinieerd:

#ifdef UNICODE
#define CopyFile CopyFileW
#else
#define CopyFile CopyFileA
#endif

Er zijn dus eigenlijk twee CopyFile functies en afhankelijk van de compilervlaggen zal de CopyFile macro worden CopyFile in een van beide.

Daar TCHAR wordt TCHAR gedefinieerd als:

#ifdef _UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif

Dus nogmaals, afhankelijk van de compileervlaggen, is TCHAR een "smal" of een "breed" (2 bytes) karakter.

Dus wanneer UNICODE wordt gedefinieerd, wordt CopyFile gedefinieerd als CopyFileW , dat 2-byte karaktermatrices gebruikt als hun parameter, die naar verwachting UTF-16 gecodeerd zijn.

Als UNICODE niet is gedefinieerd, wordt CopyFile gedefinieerd als CopyFileA dat gebruikmaakt van single-byte- CopyFileA die naar verwachting zullen worden gecodeerd in de standaard ANSI-codering van de huidige gebruiker.

Er zijn twee vergelijkbare macro's: UNICODE zorgt ervoor dat de Windows API's brede tekenreeksen verwachten en _UNICODE (met een leidende underscore) die vergelijkbare functies in de C runtime-bibliotheek mogelijk maakt.

Deze definieert ons in staat om code te schrijven die compileert in zowel ANSI als in Unicode-modus.

Het is belangrijk om te weten dat de ANSI-codering een single-byte codering (dwz latin-1) of een multi-byte codering (dwz shift jis) kan zijn, hoewel utf-8 helaas niet goed wordt ondersteund.

Dit betekent dat kan worden aangenomen dat noch de ANSI, noch de Wide-character variant van deze functies werkt met coderingen met vaste breedte.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow