我有一个类似于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指出的链接上读到的内容以下答案.
只要64位DLL由一个单独的64位进程加载,并且32位进程和64位DLL之间的所有通信都是通过操作系统可以编组的松散耦合的类似IPC的机制,那么是的你可以做到这一点.
我做了类似的事情.32位应用程序需要在DLL中实现自定义Print Spooler加载项.应用程序和假脱机程序加载项通过IPC机制进行通信(在这种情况下,这是一种说明临时文件的奇特方式).
在64位系统上,32位应用程序的一切工作正常,但Print Spooler拒绝加载外接程序DLL,因为Print Spooler当然是一个64位进程.
解决方案就像在64位中仅重建Spooler加载项一样简单.无需更改整个32位应用程序.
不需要.您必须编译两个版本:64位和32位.
我刚从CodeCentral找到了这个解决方案:http://cc.embarcadero.com/Author/802978
它允许从32位代码调用任何64位库.
这是一个复杂的解决方案,在后台运行asm编写的64位可执行文件,然后使用内存映射文件和Windows GDI消息与它进行通信,从32位Delphi进程启动一些64位函数.
有一个示例能够加载任何64位库,然后从32位可执行文件调用此库的任何函数.
似乎运作良好.在所有情况下,代码都值得一看:它是技术性的,但设计得很好!