Freigeben über


Die Tools

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.