如何从64位代码调用32位DLL?

时间:2011-12-13 04:08:26

标签: delphi 32bit-64bit delphi-xe2

我有一些32位DLL没有匹配的64位DLL。如何从用Delphi XE2编写的64位应用程序中调用这些DLL?

3 个答案:

答案 0 :(得分:14)

不,你不能直接这样做。 64位进程只能执行64位代码,32位进程只能执行32位代码。

技巧是使用多个进程....(注意这可以用于非可视代码,甚至是GUI元素,尽管对于可视元素可能存在一些小但有问题的行为。)

最常见的解决方案是将32位dll包装在进程外COM服务器中,您可以通过64/32位屏障调用该服务器。 (这有两种方式,您可以创建一个64位进程外COM服务器,并从32位应用程序调用它。)

是的,还有其他方法可以设想这个,但最常见的是使用COM:

  1. 创建一个承载32位的新的32位进程外COM服务器 DLL并公开32位dll所需的功能。
  2. 从64位代码
  3. 调用此COM服务器

    我应该补充一点,也可以将新的32位COM服务器创建为进程内COM服务器,然后配置COM +来运行它。 COM +将在进程外运行它,并在进程中神奇地运行32位进程COM服务器,您可以透明地从32位和64位代码调用它,就好像它正在进行中一样。 (注意,如果COM服务器是一个GUI控件,那么退出流程可能会也可能不会起作用。我合作的团队已经成功完成了,但是有一些复杂因素 - 其中一些无法克服 - 与挂钩父相关窗口和控件无法跨过程边界完成。)

答案 1 :(得分:4)

您可以使用与从32位代码调用64位dll相同的精确技术。

请参阅http://cc.embarcadero.com/Item/27667

“只是”相反:运行后台32位进程,使用内存映射缓冲区从64位进程进行通信。

但这绝对不是一件容易的事。你将不得不重写一些asm代码。我写了一些关于它是如何工作的article

进程外COM选项可能是最容易实现的。或者使用更简单的IPC - 如WM_COPYDATA消息或任何其他方式。但是你肯定需要另一个32位进程来链接到32位库。

答案 2 :(得分:0)

我在一段时间后遇到同样的问题并找到了这个链接:32-bit DLLs in 64-bit environment

32位DLL是很久以前用Delphi编写的,我们现在需要从64位平台调用它 - 但是我们没有64位Delphi。

我已经使它工作 - 虽然它看起来有点像kludge,但它比用64位重写DLL更好(我们不得不购买64位版本的Delphi,或者从划伤别的东西)。

NB虽然这需要一些黑客攻击,但不需要编程 - 它使用Windows附带的组件。适用于(至少)Windows 7,Windows 2008.