Share via


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.