Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Thema werden die Tools beschrieben, die Ihnen zur Verfügung stehen, um Ihre Anwendung 64-Bit bereit zu machen. Windows 10 ist für x64- und ARM64-basierte Prozessoren verfügbar.
Dateien einschließen
Die API-Elemente sind praktisch identisch zwischen 32- und 64-Bit-Windows. 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 einer neuen Headerdatei , Basetsd.h, definiert, die sich in der Gruppe der Headerdateien befindet, die von Windows.h enthalten sind. Basetsd.h enthält die neuen Datentypdefinitionen, um zu unterstützen, dass der Quellcode von der Wortgröße unabhängig ist.
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, während gleichzeitig Unterstützung für die 64-Bit-Version von Windows bereitgestellt wird. Weitere Informationen finden Sie unter "The New Data Types" oder in der Headerdatei "Basetsd.h".
Vordefinierte Makros
Der Compiler definiert die folgenden Makros, um die Plattform zu identifizieren.
| Makro | Bedeutung |
|---|---|
| _WIN64 | Eine 64-Bit-Plattform. Dazu gehören sowohl x64 als auch ARM64. |
| _WIN32 | Eine 32-Bit-Plattform. Dieser Wert wird auch vom 64-Bit-Compiler zur Abwärtskompatibilität 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 nicht mit Ausnahme von architekturspezifischem Code, sondern verwenden Sie 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 verlängert den int-Wert, UIntToPtr null verlängert den unsigned int-Wert, LongToPtr verlängert den long-Wert und ULongToPtr null verlängert den unsigned long-Wert.
64-Bit Compiler
Die 64-Bit-Compiler können verwendet werden, um Verkürzungen von Zeigern, unsachgemäße Typumwandlungen und andere 64-Bit-spezifische Probleme zu erkennen.
Wenn der Compiler zum ersten Mal ausgeführt wird, generiert er wahrscheinlich viele Abkürzungs- oder Typkonfliktwarnungen für Zeiger, 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 gestalten. Es ist eine gute Praxis, alle Warnungen zu beseitigen, insbesondere Warnungen vor Zeigerverkürzungen.
64-Bit-Compilerschalter und -Warnungen
Beachten Sie, dass dieser Compiler das LLP64-Datenmodell aktiviert.
Es gibt eine Warnoption zur Unterstützung der Portierung zu LLP64. Die Option -Wp64 -W3 aktiviert die folgenden Warnungen:
- C4305: Verkürzungs-Warnung. Zum Beispiel, "return": Verkürzung von "unsigned int64" auf "long".
- C4311: Verkürzungs-Warnung. Zum Beispiel, "type cast": Zeigerverkürzung von "int*_ptr64" zu "int".
- C4312: Warnung vor der Konversion in größere Formate. Zum Beispiel "type cast": Konversion von "int" in "int*_ptr64" mit größerer Größe.
- C4318: Übergabe der Länge Null. Übergeben Sie beispielsweise konstante Null als Länge an die memset--Funktion.
- C4319: Kein Operator. Zum Beispiel "~": Null als Erweiterung von "unsigned long" zu "unsigned _int64" größerer Größe.
- C4313: Aufruf der printf-Familie von Funktionen mit widersprüchlichen Konversions-Typangaben und Argumenten. Zum Beispiel, "printf": "%p" in der Zeichenfolge ‚format‘ steht im Widerspruch zum Argument 2 vom Typ ‚_int64‘. Ein weiteres Beispiel ist der Aufruf printf("%x", pointer_value); dies führt zu einer Verkürzung der oberen 32 Bits. Der richtige Aufruf ist printf("%p", pointer_value).
- C4244: Identisch mit der vorhandenen Warnung C4242. Beispiel: "return": Umwandlung von "_int64" in "unsigned int." Mögliche Datenverluste.
64-bit Linker und Bibliotheken
Verwenden Sie zum Erstellen von Anwendungen den Linker und 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 in diese Bibliotheken aufruft, wird nicht verknüpft, wenn die Anwendung für 64-Bit-Windows erstellt wird.