Семь шагов переноса программы в 64-битную систему - Компиляция приложения
ОГЛАВЛЕНИЕ
5. Компиляция приложения
Далее изложены типичные проблемы, возникающие на этапе компиляции 64-битной конфигурации, разобраны проблемы, возникающие в сторонних библиотеках, рассказано, что в коде, относящемся к функциям WinAPI, компилятор не позволяет помещать указатель в тип LONG, и вам придется обновить ваш код и использовать тип LONG_PTG. И это далеко не все. К сожалению, есть так много проблем, и ошибки столь разнообразны, что все их нельзя описать в одной статье даже книге. Вам придется самому изучать все ошибки, показываемые компилятором, и все отсутствовавшие ранее новые предупреждения, и в каждом конкретном случае выяснять, как надо исправить код.
Следующий список ссылок на ресурсы, посвященные разработке 64-битных приложений, может отчасти помочь вам: http://www.viva64.com/links/64-bit-development/. Список непрерывно дополняется, и автор будет рад, если читатели отправят ему ссылки на достойные внимания ресурсы.
Ниже описаны типы, представляющие интерес для разработчиков при переносе приложений. Эти типы показаны в таблице 3. Большинство ошибок перекомпиляции связано с использованием данных типов.
| Тип | Размер типа на платформе x32 / x64 | Примечание | 
| int | 32 / 32 | Базовыйтип. В 64-битных системах остается 32-битным. | 
| long | 32 / 32 | Базовыйтип. В 64-битных системах Windowsостается 32-битным. Помните, что в 64-битных системах Linuxэтот тип был увеличен до 64-битного. Не забывайте об этом, если разрабатываете код, который должен компилироваться для систем Windowsи Linux. | 
| size_t | 32 / 64 | Базовыйбеззнаковыйтип. Размер типа выбирается так, чтобы в него можно было записать массив теоретически возможного максимального размера. Можно безопасно поместить указатель в тип size_t (исключая указатели на функции класса, являющиеся особым случаем). | 
| ptrdiff_t | 32 / 64 | Знаковый тип, похожий на size_t. Результат выражения, в котором один указатель вычитается из другого (ptr1-ptr2), имеет тип ptrdiff_t. | 
| Указатель | 32 / 64 | Размер указателя прямо зависит от размера платформы. Будьте внимательны при преобразовании указателей в другие типы. | 
| __int64 | 64 / 64 | Знаковый 64-битный тип. | 
| DWORD | 32 / 32 | 32-битныйбеззнаковыйтип. В WinDef.h определенкак:typedef unsigned(беззнаковый) long(длинный) DWORD; | 
| DWORDLONG | 64 / 64 | 64-битныйбеззнаковыйтип. В WinNT.h определенкак:typedef ULONGLONG DWORDLONG; | 
| DWORD_PTR | 32 / 64 | Беззнаковый тип, в который можно поместить указатель. В BaseTsd.hопределен как: typedefULONG_PTRDWORD_PTR; | 
| DWORD32 | 32 / 32 | 32-битныйбеззнаковыйтип. В BaseTsd.h определенкак:typedef unsigned int(целый) DWORD32; | 
| DWORD64 | 64 / 64 | 64-битныйбеззнаковыйтип. В BaseTsd.h определенкак:typedef unsigned __int64 DWORD64; | 
| HALF_PTR | 16 / 32 | Половинауказателя. В Basetsd.h определенкак:#ifdef _WIN64 typedef int HALF_PTR;#else typedef short HALF_PTR;#endif | 
| INT_PTR | 32 / 64 | Знаковый тип, в который можно поместить указатель. В BaseTsd.h определенкак:#if defined(_WIN64) typedef __int64 INT_PTR; #else typedef int INT_PTR;#endif | 
| LONG | 32 / 32 | Знаковыйтип, оставшийся 32-битным. Оттого теперь зачастую должен использоваться LONG_PTR. В WinNT.h определен как:typedef long LONG; | 
| LONG_PTR | 32 / 64 | Знаковый тип, в который можно поместить указатель. В BaseTsd.h определенкак:#if defined(_WIN64) typedef __int64 LONG_PTR; #else typedef long LONG_PTR;#endif | 
| LPARAM | 32 / 64 | Параметрдляотправкисообщений. В WinNT.h определенкак:typedef LONG_PTR LPARAM; | 
| SIZE_T | 32 / 64 | Аналогтипа size_t. В BaseTsd.h определенкак:typedef ULONG_PTR SIZE_T; | 
| SSIZE_T | 32 / 64 | Аналогтипа ptrdiff_t. В BaseTsd.h определенкак: typedef LONG_PTR SSIZE_T; | 
| ULONG_PTR | 32 / 64 | Беззнаковый тип, в который можно поместить указатель. В BaseTsd.h определенкак:#if defined(_WIN64) typedef unsigned __int64 ULONG_PTR;#else typedef unsigned long ULONG_PTR;#endif | 
| WORD | 16 / 16 | Беззнаковый 16-битныйтип. In WinDef.h определенкак: typedef unsigned short(короткий) WORD; | 
| WPARAM | 32 / 64 | Параметрдляотправкисообщений. В WinDef.h определенкак: typedef UINT_PTR WPARAM; | 
Таблица 3. Типы, на которые надо обращать внимание при переносе 32-битных программ на 64-битные системы Windows.
