Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym temacie opisano narzędzia dostępne do przygotowania Twojej aplikacji do wersji 64-bitowej. System Windows 10 jest dostępny dla procesorów opartych na architekturze x64 i ARM64.
Dołączanie plików
Elementy interfejsu API są praktycznie identyczne między 32- i 64-bitowymi systemami Windows. Pliki nagłówków systemu Windows zostały zmodyfikowane, aby mogły być używane zarówno dla kodu 32-, jak i 64-bitowego. Nowe typy i makra 64-bitowe są definiowane w nowym pliku nagłówkowym Basetsd.h, który znajduje się w zestawie plików nagłówków dołączonych do systemu Windows.h. Plik Basetsd.h zawiera nowe definicje typu danych, które ułatwiają tworzenie niezależnego rozmiaru wyrazu kodu źródłowego.
Nowe typy danych
Pliki nagłówkowe systemu Windows zawierają nowe typy danych. Te typy są przeznaczone głównie do zgodności typów z 32-bitowymi typami danych. Nowe typy zapewniają dokładnie takie samo wpisywanie jak istniejące typy, jednocześnie zapewniając obsługę 64-bitowego systemu Windows. Aby uzyskać więcej informacji, zobacz Nowe typy danych lub plik nagłówka Basetsd.h.
Wstępnie zdefiniowane makra
Kompilator definiuje następujące makra, aby zidentyfikować platformę.
| Makro | Znaczenie |
|---|---|
| _WIN64 | 64-bitowa platforma. Obejmuje to zarówno x64, jak i ARM64. |
| _WIN32 | Platforma 32-bitowa. Ta wartość jest również definiowana przez kompilator 64-bitowy na potrzeby zgodności z poprzednimi wersjami. |
| _WIN16 | 16-bitowa platforma |
Następujące makra są specyficzne dla architektury.
| Makro | Znaczenie |
|---|---|
| _M_IA64 | Platforma Intel Itanium |
| _M_IX86 | Platforma x86 |
| _M_X64 | Platforma x64 |
| _M_ARM64 | Platforma ARM64 |
Nie używaj tych makr z wyjątkiem kodu specyficznego dla architektury, zamiast tego należy używać _WIN64, _WIN32 i _WIN16 zawsze, gdy jest to możliwe.
Funkcje pomocnika
Następujące funkcje wbudowane (zdefiniowane w pliku Basetsd.h) mogą ułatwić bezpieczne konwertowanie wartości z jednego typu na inny.
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 )
Ostrzeżenie
IntToPtr znak rozszerza wartość int, UIntToPtr zero-rozszerza wartość unsigned int, LongToPtr znak rozszerza wartość long, a ULongToPtr zero-rozszerza wartość unsigned long.
64-bitowy kompilator
64-bitowe kompilatory mogą służyć do identyfikowania skracania wskaźników, nieprawidłowego rzutowania typów i innych problemów specyficznych dla platformy 64-bitowej.
Podczas pierwszego uruchomienia kompilatora prawdopodobnie wygeneruje wiele ostrzeżeń dotyczących obcinania wskaźnika lub niezgodności typów, takich jak następujące:
warning C4311: 'type cast' : pointer truncation from 'unsigned char *' to 'unsigned long '
Użyj tych ostrzeżeń jako przewodnika, aby kod był bardziej niezawodny. Dobrym rozwiązaniem jest wyeliminowanie wszystkich ostrzeżeń, zwłaszcza ostrzeżeń o obcięciu wskaźnika.
64-bitowe przełączniki i ostrzeżenia kompilatora
Należy pamiętać, że ten kompilator włącza model danych LLP64.
Istnieje opcja ostrzegawcza ułatwiająca przenoszenie na LLP64. Przełącznik -Wp64 -W3 włącza następujące ostrzeżenia:
- C4305: Ostrzeżenie o obcięciu. Na przykład "return": konwersja z "bez znaku int64" do "long".
- C4311: Ostrzeżenie o obcięciu. Na przykład "type cast": obcinanie wskaźnika z "int*_ptr64" do "int".
- C4312: Konwersja na ostrzeżenie o rozmiarze większym. Na przykład "rzutowanie typu": konwersja z "int" na "int*_ptr64" o większym rozmiarze.
- C4318: Przekazywanie wartości o zerowej długości. Na przykład przekazanie wartości stałej zero jako argumentu określającego długość do funkcji memset.
- C4319: Nie operator. Na przykład "~": rozszerzenie zera "unsigned long" na "unsigned _int64" o większym rozmiarze.
- C4313: Wywoływanie rodziny funkcji printf ze specyfikatorami typów konwersji i argumentami powodującymi konflikty. Na przykład "printf": "%p" w przypadku konfliktów ciągu formatu z argumentem 2 typu "_int64". Innym przykładem jest wywołanie printf("%x", pointer_value); Powoduje to obcięcie górnych 32 bitów. Poprawne wywołanie to printf("%p", pointer_value).
- C4244: takie samo jak istniejące ostrzeżenie C4242. Na przykład "return": konwersja z "_int64" na "niepodpisane int", możliwa utrata danych.
64-bitowy linker i biblioteki
Aby tworzyć aplikacje, użyj konsolidatora i bibliotek udostępnianych przez zestaw Windows SDK. Większość bibliotek 32-bitowych ma odpowiednią 64-bitową wersję, ale niektóre starsze biblioteki są dostępne tylko w wersjach 32-bitowych. Kod wywołujący te biblioteki nie będzie łączyć się, gdy aplikacja jest kompilowana dla 64-bitowego systemu Windows.