Возможно ли получить доступ к 64-разрядной dll из 32-разрядного приложения?

У меня есть приложение Delphi, похожее на Taskbar Shuffle, которое включает в себя DLL файл.

РЕДАКТИРОВАТЬ. Эта DLL-связь связана с основным приложением, отправив сообщения Windows.

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

Возможно ли, чтобы 32-разрядное приложение обращалось к 64-разрядной DLL?

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

4 ответа

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


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

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

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

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


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

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

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

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

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


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

licensed under cc by-sa 3.0 with attribution.