2008-12-04 192 views
13

我有一个类似于Taskbar Shuffle的Delphi应用程序,它包含一个hook dll。是否可以从32位应用程序访问64位dll?

编辑:此挂钩DLL通过发送Windows消息与主应用程序进行通信。

我想添加对XP和Vista x64的支持,我最初的想法是将dll转换为64位(使用FreePascal进行编译),但现在将应用程序保留为32位(Delphi)。

是否有可能为一个32位的应用程序来访问一个64位的dll?

EDIT2:我正在通过LoadLibrary加载DLL,所以我想我被卡住了,因为32位进程将无法加载64位DLL,根据我在链接上读取的内容Lars Truijens指出下面的答案之一。

回答

6

号你必须编译两个版本:64位和32位。

+0

即使hook 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。如果在作为独立进程运行的COM对象中运行dll,并与可编组接口(例如:自动化兼容接口)通信,它应该可以工作。这并不总是可行的,取决于dll的作用以及集成和调用表面的广泛程度,但它是应该能够使这种情况成为可能的选项。

9

只要在64位DLL被通过一个单独的64位过程中加载,和32位的处理和64位DLL之间的所有通信经由松散耦合IPC状机构,该OS可以马歇尔,那么你可以做到这一点。

我做了类似的事情。一个32位应用程序需要在DLL中实现的自定义打印后台处理程序加载项。应用程序和后台打印程序加载项通过IPC机制进行通信(在这种情况下,这是一种说临时文件的奇特方式)。

在64位系统上,除了打印后台处理程序拒绝加载加载项DLL,因为打印后台处理程序当然是64位进程,所有有关32位应用程序的工作都可以正常工作。

将该溶液作为重建只后台处理程序加载在64位一样简单。无需更改整个32位应用程序。

6

我只是发现了这个解决方案,从CodeCentral: http://cc.embarcadero.com/Author/802978

它允许调用从32位代码中的任何64位库。

这是一个复杂的解决方案,在后台运行一个由asm编写的64位可执行文件,然后使用内存映射文件和windows GDI消息与其进行通信,以从32位Delphi进程启动一些64位函数。

有一个样品,其能够装载任何64位库,然后调用该库中的任何功能中,从32位的可执行文件。

似乎很好。在所有情况下,代码都值得一看:它是技术性的,但设计良好!

相关问题