【问题标题】:How can I call a 32-bit DLL from 64-bit code?如何从 64 位代码调用 32 位 DLL?
【发布时间】:2012-01-19 00:44:08
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

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

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

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

是的,还有其他方法可以实现这一点,但最常见的是使用 COM:

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

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

【讨论】:

  • 它不应该完全是 COM 包装器。它可以是任何适合您需求的进程间通信技术。
【解决方案2】:

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

见http://cc.embarcadero.com/Item/27667

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

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

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

【讨论】:

  • 这项工作可以从 64 位进程调用 32 位吗?我需要确切的对面?
  • Arnaud 的方法适用于双向,64 到 32 和 32 到 64。
【解决方案3】:

前段时间我遇到了同样的问题,发现这个链接:32-bit DLLs in 64-bit environment

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

我已经让它工作了——虽然它看起来有点杂乱无章,但它比用 64 位重写 DLL 更好(我们必须购买 64 位版本的 Delphi,或者从在其他东西上刮擦)。

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

【讨论】:

    猜你喜欢
    • 2017-02-18
    • 2010-09-12
    • 1970-01-01
    • 2017-04-01
    • 2013-06-11
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2013-06-08
    相关资源
    最近更新 更多