在64位应用程序中使用32位COM库

11

我有一个32位的COM库,希望能够在64位的应用程序中使用其功能。我在互联网上搜索到了这个解决方法

  1. 找到你的COM对象GUID,它位于HKey_Classes_Root\Wow6432Node\CLSID\[GUID]
  2. 找到后添加一个新的REG_SZ (字符串)值,名称应该是AppID,数据应该与你刚刚搜索到的COM对象GUID相同
  3. HKey_Classes_Root\Wow6432Node\AppID\下添加一个新的键
  4. 新键的名称应该与COM对象GUID相同
  5. 在你刚刚添加的新键下,添加一个新的REG_SZ (字符串)值,并将其命名为DllSurrogate。将值留空
  6. HKey_Local_Machine\Software\Classes\AppID\下创建一个新的键

但是,它不适用于Windows 7 64位操作系统,主要问题是当我执行第6步时,我发现关键字已经存在了。有人知道为什么吗?或者我该如何克服这个问题?

这里的文档非常简洁。


1
第三步应该创建对32位程序可见的键。更准确的键名是HKLM\Software\Wow6432Node\Classes\AppID。第六步应该创建对64位程序可见的键,路径相同,只是去掉了“Wow6432Node”部分。如果你在第三步创建的键在第六步的路径中可见,那么你的机器肯定有问题。不要跳过Wow6432Node部分。 - Hans Passant
你认为问题可能是因为我使用了32位或64位的regedit吗? 问题可能是我使用32位或64位的regsrv32.exe注册了库吗? - Yamen Ajjour
1
你考虑过将这个库重建为64位吗?(或者,我想一个更好的问题是,你是否有访问该库源代码的权限?) - George Newton
也许可以使用 .net 作为适配器来桥接 API 调用。 - hB0
4个回答

1
所以,您需要做的是在其自己的进程中启动这个32位COM组件,即通过使用CLSCTX_LOCAL_SERVER调用CoCreateInstance。
要么这将是现有DLL的直接操作,要么如果不行,您应该用自己的32位简单COM组件进行包装,支持作为本地服务器运行...
试图调整注册表是一场无法获胜的游戏-按照DLL的意图使用它并节省您的痛苦。

0

64位可执行文件无法调用32位DLL(反之亦然)。您应该将64位应用程序编译为32位。这样,您就可以在32位和64位操作系统上使用DLL并运行所有内容。


0
这个问题可能是由注册表虚拟化引起的。我过去也遇到过类似的问题,最大的烦恼是你看不到编辑器抱怨的值或键已经存在。实际上它们存在于注册表的另一个部分(很可能是用户部分)。
祝好运。

0

注册表只是定位所需dll的一种合适方式。

如果您知道每个系统上32位dll的路径,或者可以将其随应用程序一起传递,并且您控制64位应用程序的代码,则可以使用以下技术: 1)SxS机制+清单允许从本地文件夹加载dll而无需注册它并创建COM组件 2)手动制作 http://www.codeproject.com/Articles/18433/Emulating-CoCreateInstance

第二种解决方案要简单得多...


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