通过 COM 在 64 位进程中使用 32 位 DLL

Posted

技术标签:

【中文标题】通过 COM 在 64 位进程中使用 32 位 DLL【英文标题】:Utilizing a 32-bit DLL in a 64-bit process via COM 【发布时间】:2012-01-29 10:17:09 【问题描述】:

所以前段时间我正在调查一个我知道很快就会出现的问题。我们有一个链接到某个库的 32 位版本的 DLL。我们没有可用的此库的 x64 版本,并且我们没有实际的选择来替换它。

当我进行初步调查时,我发现一两篇文章描述了 64 位进程可以通过 COM“服务器”使用 32 位 DLL (Windows) 的方法。不幸的是,我丢失了保存的链接,现在我已经搜索了一个多小时,但没有成功。

这里有人熟悉我所描述的过程吗?我这辈子都不记得我曾经用哪个魔法咒语在搜索中提取正确的结果,当然,现在是实施时间。提前感谢你们提供的任何帮助,我会在此期间继续搜索。

【问题讨论】:

我想您可以通过谷歌搜索“COM 代理”和“COM+ 托管”找到您的链接。 @HansPassant:这就是我需要的词。谢谢。 (主要是为了其他人偶然发现答案)请记住,这样做涉及进程间数据封送处理,这可能会很昂贵 - 它不是自动修复所有的灵丹妙药问题。 【参考方案1】:

这可能还不够,但它可能会让你开始:Process Interoperability

在 64 位 Windows 上,进程外 32 位 COM 服务器可以与 64 位客户端通信,而进程外 64 位 COM 服务器可以与 32 位客户端通信。 因此,如果您有一个不支持 COM 的 32 位 DLL,您可以将其包装在进程外 COM 服务器中,并使用 COM 编组对 64 位进程的调用。强>

还有Accessing 32-bit DLLs from 64-bit code

如果您有无法重写的 32 位 DLL,则将 32 位 Windows 应用程序迁移到 64 位计算机可能会出现问题。 Mike Becker 向您展示了如何使用内置 IPC 机制从 64 位代码访问 32 位 DLL...

【讨论】:

这就是我要搜索的链接。谢谢先生。 不客气。我已经为需要它的第二个链接添加了书签:)【参考方案2】:

Client of Out-of-process Local Server 是在进程外运行 COM 的示例。如果您在进程外运行 com 服务器,您的客户端可以是 64 位,服务器可以是 32 位。

【讨论】:

【参考方案3】:

您可以创建一个始终以 32 位运行的 COM exe 或服务。在这个 32 位 exe 中,您可以访问链接到 32 位版本库的 32 位 dll。

下面的框图解释了基础知识

查看此链接了解详情:

http://blog.mattmags.com/2007/06/30/accessing-32-bit-dlls-from-64-bit-code/#more-355

【讨论】:

以上是关于通过 COM 在 64 位进程中使用 32 位 DLL的主要内容,如果未能解决你的问题,请参考以下文章

使用 C++ 从 32 位进程访问 64 位 dll

64 位托管进程:进程外 32 位 COM 服务器非默认接口不可用

是否可以通过模式切换在 64 位进程中执行 32 位代码?

带有 32 位 VB6 COM 对象的 64 位 C#

32位程序注入64位DLL到64位进程

可以通过参数“-d32”强制 64 位 JVM 使用 32 位模式吗?