Как я могу вызвать 32-битную DLL из 64-битного кода? - PullRequest
9 голосов
/ 13 декабря 2011

У меня есть некоторые 32-разрядные библиотеки DLL, которые не соответствуют 64-разрядным библиотекам DLL. Как я могу вызвать эти библиотеки DLL из 64-битного приложения, написанного на Delphi XE2?

Ответы [ 3 ]

14 голосов
/ 13 декабря 2011

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

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

Наиболее распространенное решение - это обернуть 32-битную DLLв COM-сервере вне процесса, который вы можете вызвать через 64/32 битный барьер.(Это происходит в обоих направлениях: вы можете создать 64-битный внепроцессный COM-сервер и вызывать его также из 32-битного приложения.)

Да, есть и другие способы представить это, но наиболее распространенным являетсядля использования COM:

  1. Создайте новый 32-битный внепроцессный COM-сервер, на котором размещена ваша 32-битная DLL и предоставляется необходимая функциональность из 32-битной библиотеки DLL.
  2. Вызовите этот COM-сервер из своего 64-битного кода

Я должен добавить, что можно также создать новый 32-битный COM-сервер в качестве внутрипроцессного COM-сервера, а затемнастроить COM + для его запуска.COM + запустит его из процесса, и волшебным образом запустит ваш 32-битный в процессе COM-сервер вне процесса, где вы можете прозрачно вызвать его из 32- и 64-битного кода, как если бы он был в процессе.(Обратите внимание, что если COM-сервер является элементом управления с графическим интерфейсом, выход из процесса может или не может работать. Команда, с которой я работаю, сделала это успешно, но есть сложности - некоторые из которых не могут быть преодолены - связанные с перехватом родителяокна и элементы управления, которые нельзя сделать через границу процесса.)

4 голосов
/ 13 декабря 2011

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

См. http://cc.embarcadero.com/Item/27667

"Просто" сделайте наоборот: запустите фоновый 32-битный процесс, обменивайтесь данными с вашим 64-битным процессом, используя буфер с отображенной памятью.

Но это определенно непростая задача. Вам придется переписать некоторый код asm. Я написал статью о том, как это работает.

Опция COM вне процесса, пожалуй, самая простая в реализации. Или используйте более простое IPC-подобное WM_COPYDATA сообщение или любое другое средство. Но вам обязательно нужен еще один 32-битный процесс для связи с 32-битными библиотеками.

0 голосов
/ 26 февраля 2014

У меня была такая же проблема некоторое время назад, и я нашел эту ссылку: 32-битные DLL в 64-битной среде

32-битная DLL была написана в Delphi много лет назад,и теперь нам нужно было вызвать его с 64-битной платформы, но у нас нет 64-битной Delphi.

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

NB, хотя это требует некоторого взлома,программирование не требуется - оно использует компоненты, поставляемые с Windows.Работает в (как минимум) Windows 7, Windows 2008.

...