Можно ли получить доступ к 64-битной DLL из 32-битного приложения? - PullRequest
13 голосов
/ 04 декабря 2008

У меня есть приложение Delphi, похожее на Панель задач Shuffle , которое включает в себя хук DLL.

РЕДАКТИРОВАТЬ : эта подключаемая DLL связывается с основным приложением путем отправки сообщений Windows.

Я хочу добавить поддержку XP и Vista x64, и моя первоначальная идея состояла в том, чтобы преобразовать dll в 64-битную (компилируя ее с FreePascal), но пока оставьте приложение 32-битным (Delphi).

Возможно ли для 32-битного приложения доступ к 64-битной DLL?

EDIT2 : я загружаю dll через LoadLibrary, так что я думаю, что застрял, поскольку 32-битный процесс не сможет загрузить 64-битную dll, в соответствии с тем, что я прочитал по ссылке, указанной Ларсом Труйенсом на один из ответов ниже.

Ответы [ 4 ]

9 голосов
/ 04 декабря 2008

Пока 64-битная DLL загружается отдельным 64-битным процессом, а вся связь между 32-битным процессом и 64-битной DLL происходит через слабосвязанные IPC-подобные механизмы, которые ОС может собирать, тогда да, вы можете сделать это.

Я сделал нечто подобное. 32-разрядному приложению требовалась пользовательская надстройка диспетчера очереди печати, реализованная в DLL. Приложение и надстройка спулера обменивались данными через механизмы IPC (в данном случае причудливый способ сказать временные файлы).

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

Решение было таким же простым, как перестройка только надстройки Spooler в 64-битной версии. Нет необходимости менять все 32-битное приложение.

6 голосов
/ 27 мая 2011

Я только что обнаружил это решение от CodeCentral: http://cc.embarcadero.com/Author/802978

Позволяет вызывать любую 64-битную библиотеку из 32-битного кода.

Это сложное решение: запустить в фоновом режиме 64-битный исполняемый файл asm, а затем связаться с ним, используя файлы с отображенной памятью и сообщения Windows GDI для запуска некоторых 64-битных функций из 32-битного процесса Delphi.

Существует пример, который может загрузить любую 64-битную библиотеку, а затем вызвать любую функцию этой библиотеки из 32-битного исполняемого файла.

Кажется, работает хорошо. В любом случае, код стоит того, чтобы его посмотреть: он технический, но хорошо продуманный!

6 голосов
/ 04 декабря 2008

Нет. Вам придется скомпилировать две версии: 64-битную и 32-битную.

2 голосов
/ 04 декабря 2008

Нет, но вы можете обойти это, используя COM. Если вы запускаете dll внутри COM-объекта, который работает как отдельный процесс, и взаимодействуете с маршалируемыми интерфейсами (например, интерфейсами, совместимыми с автоматизацией), это должно работать. Это не всегда выполнимо, в зависимости от того, что делает dll и насколько обширны поверхности интеграции и вызова, но это вариант, который должен быть в состоянии сделать этот сценарий возможным.

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