2015-09-15 8 views
-1

Я использую Delphi XE4 и пытаюсь добиться 32/64-битной совместимости, для этого мне нужно хранить 2 библиотеки DLL (один 32 других 64) на ресурсе, экспортировать их, и если исполняемый файл обнаруживает 64-битную ОС, он будет использовать 64-битную DLL. Но я хочу, чтобы включить этот ресурс, только при компиляции 32-битной версии исполняемого файла, так что я пытаюсь получить что-то вроде этого:Компиляция .rc-файла inline

{$IFDEF WIN32} 
{$R Resources.res Resources.rc} 
{$ENDIF} 

Я не знаю, правильно ли это, потому что я не мог» t, строка: {$ R Resources.res Resources.rc} не работает, как я ожидал.

Если удалить Resources.res файл, он дает мне ошибку

[dcc32 Error] E1026 Файл не найден: '' Resources.res

Если я оставить файл предварительно скомпилированных .res, он не обновляется при сборке/компиляции, даже если я изменяю свой .rc-файл (например, удаляя одну из DLL), exe все равно получает одинаковый размер, поэтому я считаю, что он не обновил файл .res ...

Мой файл .rc является:

X86RES RCDATA x86.dll 
X64RES RCDATA x64.dll 

Как получить этот файл rc, скомпилированный в ресурсы, только при компиляции для 32-битной среды?

+0

Я считаю, что вы ищете 'WIN32' и' WIN64'. Вам также придется отделять свои сценарии - один для 32, а другой для 64. –

+0

Какой сценарий вы имеете в виду? – user3810691

+0

Я имею в виду, что файл сценария '.rc' должен быть 2 файла, а затем использовать' WIN32' и 'WIN64' для условного включения одного или другого. –

ответ

0
  • Создайте два файла .rc. Один для 32-разрядной библиотеки DLL и один для 64-разрядной библиотеки DLL.
  • Скомпилируйте оба файла ресурсов в файлы .res.
  • Для 32-битной сборки свяжите только файл .res, содержащий 32-битную DLL.
  • Для 64-битной сборки свяжите оба файла .res.

Лично я не являюсь поклонником получения IDE/компилятора для компиляции моих ресурсов. Мне нравится делать это в сценарии предварительной сборки. Но это в основном только личный вкус.

Следует отметить, что IDE/компилятор не будет перекомпилировать сценарий ресурса при компиляции проекта. Только если вы выполните сборку или удалите скомпилированный файл .res, будет ли скомпилирован сценарий ресурса.

Это одна из причин, по которой мне нравится собирать ресурсы. Другое существо, что я могу выбрать используемый компилятор ресурсов, который может быть важным в сценариях, где компилятор ресурсов Embarcadero недостаточен.


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

+0

Просто несколько вопросов: Как я свяжусь для 32-битного построить один .res, а для 64-битной сборки другой .res? Я имею в виду, автоматически. И как я могу скомпилировать оба .res автоматически тоже? И если я планирую иметь только один финальный exe (32bit), который должен экспортировать 64-разрядный exe и обе библиотеки dll, как все это будет работать? – user3810691

+0

Я думаю, что гораздо проще работать с одним EXE (32-битным) и одним .rc-файлом с 3 ресурсами внутри (32dll, 64dll, 64exe), поэтому я компилирую их все в .res и извлекаю их, если 32-разрядный exe обнаруживает 64-битную ОС, запускает 64bit.exe, который загружает 64bit.dll ... Все это внутри одного и того же файла exe и того же rc. Единственная проблема заключается в том, что бессмысленно иметь этот rc-файл, связанный внутри 64-битной версии, вот и вся проблема, я могу удалить/добавить ее вручную, но не могу ли IDE справиться с этим? – user3810691

+0

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