Разработка Windows: переход с x86 на x64 - PullRequest
4 голосов
/ 15 марта 2010

Есть ли рекомендации, как перейти на x64 с наименьшей болью?

Предположим, у меня есть исполняемый файл Windows x86, написанный на C ++. EXE прекрасно работает сам по себе, но есть также DLL, которая размещается как в предыдущем EXE, так и во внешнем x64-процессе. При такой настройке какие части мне нужно переписать?

Буду признателен за более общий ответ или, возможно, за ссылку на ссылку, где приведено некоторое теоретическое обоснование. Спасибо

Ответы [ 3 ]

5 голосов
/ 16 марта 2010

В общем, я рекомендую подходить к юнит-тестированию. Создайте свои тесты так, чтобы все они проходили 32-битную реализацию, а затем начните сборку и тестирование на 64-битной. Стоит уделить особое внимание любым частям вашего кода, где вы делаете любое из следующего:

  • Потоковая передача данных по сети (особенно для таких типов, как size_t, которые теперь будут другого размера. Просмотрите этот код и измените такие вещи, как size_t и long на явные 32- или 64-битные определения типов)
  • Загрузка / сохранение двоичных данных в файл (то же самое: size_t / long)
  • Переплетать биты с жестко закодированными значениями, такими как 0xFFFFFFFF

На самом деле нет никаких ярлыков, кроме как для тестирования как можно большего количества путей кода. Насколько легкой будет работа, будет зависеть от того, насколько переносимым был написан код. Тебе может повезти ...

3 голосов
/ 15 марта 2010

В этой статье SDK перечислены соображения для 64-битной Windows. Специфические особенности MSVC ++ перечислены здесь . В общем, простая компиляция кода избавит вас от большинства проблем. Я не могу комментировать ваш конкретный сценарий, он недостаточно подробен.

2 голосов
/ 29 марта 2010

Я обнаружил, что лучший способ устранить ошибки - это проверить ваш код на наличие любого кода, который выполняет любое из следующих действий, и исправить его в 32-битном мире, а затем запустить порт.

  • Использует нетипизированные контейнеры и броски, а не правильный контейнер.
  • Использует приведения для хранения указателей в DWORD по любой причине, обычно в качестве возможной прелюдии к хранению в контейнере
  • литье при архивировании

Для случаев, когда вам действительно нужно выполнить команду DWORD / ptr, измените тип на DWORD_PTR.

Я видел много кода, использующего CStringToPtr, а не CMap <> с соответствующими типами.

Все эти вещи, вероятно, будут скомпилированы на 64-битной (без предупреждений из-за приведения), а затем упадут на лицо. Если бы они использовали правильные типы и не приводили приведения, код работал бы в первый раз.

Также проверьте наличие любого кода подкласса, который устанавливает WndProc - вам нужен другой флаг, чтобы установить его в 64-битной Windows.

Если вы используете MFC, вы также (бесполезно) обнаружите, что размеры контейнеров теперь возвращают значения 64-разрядного размера, а не 32-разрядного, что означает, что ваша 32-разрядная / 64-разрядная архивация будет нарушена. Вам придется решать это по ходу дела. Мы создали нашу собственную реализацию MFC с некоторыми хитрыми хитростями, чтобы позволить десериализовать 32-битные архивы в 64-битных блоках и наоборот.

...