Можем ли мы создать исполняемый файл VC ++, который будет работать как на 32-битной, так и на 64-битной Windows? - PullRequest
7 голосов
/ 28 августа 2010

Есть ли способ построить проект VC ++, чтобы созданный им dll / exe работал как 32-битное приложение в 32-битной ОС Windows и как 64-битное приложение в 64-битной ОС Windows (не в WOW64).

Я знаю, что это возможно для приложений C #, использующих параметр / ANYCPU.

Ответы [ 2 ]

10 голосов
/ 28 августа 2010

CLR имеет специальную поддержку загрузчика для параметра / ANYCPU.

Если вы действительно хотите сделать это для родного, лучший способ сделать это:

  1. Сборка вашего двоичного файла для 32- и 64-разрядных
  2. Как часть построения 32-разрядного двоичного файла, включите 64-разрядный двоичный файл в качестве ресурса
  3. On 32-битовые машины, просто запустите 32-битный двоичный файл
  4. На 64-битных машинах, когда 32-битный двоичный файл запустится, распакуйте 64-битный двоичный ресурс, запишите его на диск и запустите оттуда*

Вот как работают инструменты Sysinternals (загрузите Process Explorer на 64-разрядную машину и запустите его: вы увидите, что он записывает файл procxp64.exe на диск, а затем запускает егооттуда).Это взлом, но это работает.

5 голосов
/ 28 августа 2010

Не AFAIK - проблема в том, что

  1. вам потребуется отдельный код;это работает для C #, потому что вы генерируете .NET IL, который преобразуется в собственный код в целевой системе
  2. формат Windows PE имеет только один заголовок изображения и не имеет возможности соединиться с другим заголовком позже, чтобы поставитьоба набора кода в одной и той же библиотеке.

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

...