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

9

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


不,http://blogs.msdn.com/b/oldnewthing/archive/2008/10/20/9006720.aspx - VibeeshanRC
如果你的32位DLL没有64位版本,那么它就有点不被支持了。在使用它们之前三思。 - VibeeshanRC
如果我是你,我会简单地用支持64位的组件替换那些组件。 - David Heffernan
3个回答

15
不,你不能直接这样做。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控件,则转移到进程外可能有效,也可能无效。我们的团队已成功地完成了这项工作,但与钩子父窗口和跨进程边界无法完成的控件相关的复杂性。)

2
它不应该是完全的COM包装器。它可以是任何适合您需求的进程间通信技术。 - Torbins

4
你可以使用相同的技术从32位代码调用64位dll。请参见http://cc.embarcadero.com/Item/27667。只需要运行一个后台32位进程,然后使用内存映射缓冲区从64位进程与其通信即可。但这绝对不是一项易事。您将不得不重写一些汇编代码。我写了一篇文章介绍了它的工作原理。选择进程外COM选项可能是实现最简单的方法。或使用更简单的IPC,例如WM_COPYDATA消息或任何其他方式。但您绝对需要另一个32位进程来链接到32位库。

这个从64位进程调用32位的方法可行吗?我需要相反的效果。 - user1647411
Arnaud的方法可以双向转换,从64位到32位和从32位到64位。 - Jonesome Reinstate Monica

0

我曾经遇到过同样的问题,后来找到了这个链接:在64位环境中使用32位DLL

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

我已经让它工作了-虽然它似乎有点笨拙,但比起在64位上重新编写DLL(我们必须购买64位版本的Delphi或从其他语言开始),这还是更好的选择。

需要注意的是,虽然这需要一些技巧,但不需要编程-它使用的是Windows自带的组件。适用于(至少)Windows 7、Windows 2008。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接