我有一个类似于Taskbar Shuffle的Delphi应用程序,其中包含一个hook dll。
编辑:此挂钩DLL通过发送Windows消息与主应用程序通信。
我想添加对XP和Vista x64的支持,我最初的想法是将dll转换为64位(用FreePascal编译)但是现在保持应用程序32位(Delphi)。
32位应用程序是否可以访问64位dll?
EDIT2 :我正在通过LoadLibrary加载dll所以我想我已经卡住了,因为32位进程无法加载64位dll,根据我的说法阅读Lars Truijens在下面的答案中指出的链接。
答案 0 :(得分:9)
只要64位DLL由一个单独的64位进程加载,并且32位进程和64位DLL之间的所有通信都是通过OS可以编组的松散耦合的IPC类机制,那么是的,你可以做到。
我做过类似的事情。 32位应用程序需要在DLL中实现自定义Print Spooler加载项。应用程序和假脱机程序加载项通过IPC机制进行通信(在这种情况下,这是一种说明临时文件的奇特方式)。
在64位系统上,关于32位应用程序的一切工作正常,但Print Spooler拒绝加载外接程序DLL,因为Print Spooler当然是一个64位进程。
解决方案就像在64位中仅重建Spooler加载项一样简单。无需更改整个32位应用程序。
答案 1 :(得分:6)
没有。你必须编译两个版本:64位和32位。
答案 2 :(得分:6)
我刚从CodeCentral找到了这个解决方案: http://cc.embarcadero.com/Author/802978
它允许从32位代码调用任何64位库。
这是一个复杂的解决方案,在后台运行asm编写的64位可执行文件,然后使用内存映射文件和Windows GDI消息与它通信,从32位Delphi进程启动一些64位函数。
有一个示例能够加载任何64位库,然后从32位可执行文件中调用该库的任何函数。
似乎运作良好。在所有情况下,代码都值得一看:它是技术性的,但设计得很好!
答案 3 :(得分:2)
不,但您可以使用COM解决这个问题。如果在作为独立进程运行的COM对象中运行dll,并与可编组接口(例如:自动化兼容接口)进行通信,则它应该可以工作。它并不总是可行的,具体取决于dll的作用以及集成和调用表面的扩展程度,但它是一个应该能够使该场景成为可能的选项。