【问题标题】:using com 32 bits library on 64 bits application在 64 位应用程序上使用 com 32 位库
【发布时间】:2013-09-04 03:57:31
【问题描述】:

我有一个 32 com 库,想通过 64 位应用程序使用它的功能,我在互联网上搜索并设法得到这个 workaround

  1. HKey_Classes_Root\Wow6432Node\CLSID\[GUID] 下找到您的 COM 对象 GUID
  2. 找到后添加一个新的REG_SZ (string) 值。名称应该是 AppID,数据应该是您刚刚搜索的同一个 COM 对象 GUID
  3. HKey_Classes_Root\Wow6432Node\AppID\下添加一个新密钥
  4. 新键的调用方式应与 com 对象 GUID 相同
  5. 在刚刚添加的新密钥下,添加一个新的REG_SZ (string) 值,并将其命名为DllSurrogate。将值留空
  6. HKey_Local_Machine\Software\Classes\AppID\下创建一个新密钥

但它不适用于 Windows 7 64 位,主要问题是当我执行第 6 步时 我发现钥匙已经存在了,有人知道为什么吗?或者我该如何克服它?

这里的文档很简短

【问题讨论】:

  • 步骤 3 应该创建对 32 位程序可见的密钥。更准确的键名是 HKLM\Software\Wow6432Node\Classes\AppID。第 6 步应该创建对 64 位程序可见的密钥,相同的路径减去“Wow6432Node”部分。如果您在第 3 步中创建的密钥在第 6 步的路径中可见,则您的机器出现了严重问题。不要跳过 Wow6432Node 部分。
  • 您认为问题可能存在,因为我使用或使用了 32 位或 64 位 regedit 吗?问题是我用 32 或 64 regsrv32.exe 注册了库吗?
  • 您是否考虑过将库重建为 64? (或者,我想一个更好的问题是,您可以访问库源吗?)
  • 也许使用 .net 作为适配器来桥接 API 调用

标签: c++ com com+


【解决方案1】:

所以,你需要做的是在它自己的进程中启动这个 32 位 COM 组件,即使用 CLSCTX_LOCAL_SERVER 调用 CoCreateInstance。

这将直接与现有的 DLL 一起使用,或者如果不是,您应该使用您自己的支持作为本地服务器运行的 32 位简单 COM 组件来包装它...

尝试调整注册表是一场没有胜算的游戏 - 按预期使用 Dll 并免去您的痛苦。

【讨论】:

    【解决方案2】:

    这可能是由registry virtualization 引起的。我过去也遇到过这样的问题。最大的烦恼是你看不到编辑器抱怨的值或键已经存在。它们实际上存在于注册表的不同部分(可能是用户配置单元)。

    祝你好运

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-07-28
          • 2012-12-27
          • 2012-02-24
          • 1970-01-01
          • 2021-03-06
          • 1970-01-01
          • 2014-04-27
          • 2011-03-08
          相关资源
          最近更新 更多