2008-12-04 2 views
13

У меня есть приложение Delphi, подобное Taskbar Shuffle, которое включает в себя DLL-файл.Возможно ли получить доступ к 64-разрядной dll из 32-разрядного приложения?

EDIT: Эта DLL-связь связана с основным приложением путем отправки сообщений Windows.

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

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

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

ответ

6

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

+0

Даже если задача dll для подключения только для связи с основным приложением для отправки сообщений Windows? – smartins 2008-12-04 08:33:59

+0

Нет, 32-разрядная DLL загружается в 64-битный процесс или наоборот. Если это не так, то проблем нет. – 2008-12-04 09:56:35

+0

Неверный ответ.Теперь это возможно, если вы создаете фоновый 64-битный процесс. :) – 2011-05-27 06:33:35

2

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

9

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

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

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

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

6

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

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

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

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

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