Die Tools
In diesem Thema werden die Tools beschrieben, die Ihnen zur Verfügung stehen, um Ihre Anwendung 64-Bit-fähig zu machen. Windows 10 ist für x64- und ARM64-basierte Prozessoren verfügbar.
Includedateien
Die API-Elemente sind zwischen 32- und 64-Bit-Windows praktisch identisch. Die Windows-Headerdateien wurden so geändert, dass sie sowohl für 32- als auch für 64-Bit-Code verwendet werden können. Die neuen 64-Bit-Typen und Makros werden in der neuen Headerdatei Basetsd.h definiert, die sich in der Gruppe der Headerdateien befindet, die in Windows.h enthalten sind. Basetsd.h enthält die neuen Datentypdefinitionen, um quellcodeunabhängige Wortgrößen zu machen.
Neue Datentypen
Die Windows-Headerdateien enthalten neue Datentypen. Diese Typen dienen in erster Linie der Typkompatibilität mit den 32-Bit-Datentypen. Die neuen Typen bieten genau die gleiche Typisierung wie die vorhandenen Typen und bieten gleichzeitig Unterstützung für das 64-Bit-Windows. Weitere Informationen finden Sie unter Die neuen Datentypen oder die Basetsd.h-Headerdatei.
Vordefinierte Makros
Der Compiler definiert die folgenden Makros, um die Plattform zu identifizieren.
Makro | Bedeutung |
---|---|
_WIN64 | Eine 64-Bit-Plattform. Dies umfasst sowohl x64 als auch ARM64. |
_WIN32 | Eine 32-Bit-Plattform. Dieser Wert wird aus Gründen der Abwärtskompatibilität auch vom 64-Bit-Compiler definiert. |
_WIN16 | Eine 16-Bit-Plattform |
Die folgenden Makros sind spezifisch für die Architektur.
Makro | Bedeutung |
---|---|
_M_IA64 | Intel Itanium-Plattform |
_M_IX86 | x86-Plattform |
_M_X64 | x64-Plattform |
_M_ARM64 | ARM64-Plattform |
Verwenden Sie diese Makros nur mit architekturspezifischem Code. Verwenden Sie stattdessen nach Möglichkeit _WIN64, _WIN32 und _WIN16.
Hilfsfunktionen
Die folgenden Inlinefunktionen (definiert in Basetsd.h) können Ihnen helfen, Werte sicher von einem Typ in einen anderen zu konvertieren.
void * Handle64ToHandle( const void * POINTER_64 h )
void * POINTER_64 HandleToHandle64( const void *h )
long HandleToLong( const void *h )
unsigned long HandleToUlong( const void *h )
void * IntToPtr( const int i )
void * LongToHandle( const long h )
void * LongToPtr( const long l )
void * Ptr64ToPtr( const void * POINTER_64 p )
int PtrToInt( const void *p )
long PtrToLong( const void *p )
void * POINTER_64 PtrToPtr64( const void *p )
short PtrToShort( const void *p )
unsigned int PtrToUint( const void *p )
unsigned long PtrToUlong( const void *p )
unsigned short PtrToUshort( const void *p )
void * UIntToPtr( const unsigned int ui )
void * ULongToPtr( const unsigned long ul )
Warnung
IntToPtr-Sign-erweitert den int-Wert , UIntToPtr zero-erweitert den unsigned int-Wert , LongToPtr-Zeichen erweitert den long-Wert und ULongToPtr 0-erweitert den wert ohne Vorzeichen .
64-Bit-Compiler
Die 64-Bit-Compiler können verwendet werden, um Zeigerkürzungen, falsche Typumwandlungen und andere 64-Bit-spezifische Probleme zu identifizieren.
Wenn der Compiler zum ersten Mal ausgeführt wird, generiert er wahrscheinlich viele Zeigerkürzungs- oder Typkonfliktwarnungen, z. B. die folgenden:
warning C4311: 'type cast' : pointer truncation from 'unsigned char *' to 'unsigned long '
Verwenden Sie diese Warnungen als Leitfaden, um den Code robuster zu machen. Es empfiehlt sich, alle Warnungen zu beseitigen, insbesondere Warnungen zum Abschneiden von Zeigern.
64-Bit-Compilerswitches und Warnungen
Beachten Sie, dass dieser Compiler das LLP64-Datenmodell aktiviert.
Es gibt eine Warnoption zur Unterstützung der Portierung zu LLP64. Der Schalter -Wp64 -W3 aktiviert die folgenden Warnungen:
- C4305: Abschneidungswarnung. Beispiel: "return": Abschneiden von "unsigned int64" zu "long".
- C4311: Abschneidungswarnung. Beispiel: "type cast": Zeigerkürzung von "int*_ptr64" zu "int".
- C4312: Konvertierung in größere Warnungen. Beispiel: "type cast": Konvertierung von "int" in "int*_ptr64" mit größerer Größe.
- C4318: Übergeben der Länge null. Beispiel: Übergeben der Konstanten Null als Länge an die memset-Funktion .
- C4319: Not-Operator. Beispiel: "~": null, die "unsigned long" auf "unsigned _int64" erweitert.
- C4313: Aufrufen der printf-Funktionsfamilie mit in Konflikt stehenden Konvertierungstypspezifizierern und Argumenten. Beispiel: "printf": "%p" in der Formatzeichenfolge in Konflikt mit Argument 2 des Typs "_int64". Ein weiteres Beispiel ist der Aufruf printf("%x", pointer_value); Dies führt zu einer Kürzung der oberen 32 Bits. Der richtige Aufruf ist printf("%p", pointer_value).
- C4244: Identisch mit der vorhandenen Warnung C4242. Beispiel: "return": Konvertierung von "_int64" in "unsigned int", möglicher Datenverlust.
64-Bit-Linker und Bibliotheken
Verwenden Sie zum Erstellen von Anwendungen den Linker und die Bibliotheken, die vom Windows SDK bereitgestellt werden. Die meisten 32-Bit-Bibliotheken verfügen über eine entsprechende 64-Bit-Version, aber bestimmte Legacybibliotheken sind nur in 32-Bit-Versionen verfügbar. Code, der diese Bibliotheken aufruft, wird nicht verknüpft, wenn die Anwendung für 64-Bit-Windows erstellt wird.