【问题标题】:How to use a 32 bit COM object on Windows Server 2008 (works on 2008 R2 but non 2008)如何在 Windows Server 2008 上使用 32 位 COM 对象(适用于 2008 R2 但非 2008)
【发布时间】:2011-05-01 22:22:53
【问题描述】:

我使用默认的 DllSurrogate 来启用 64 位 32 位 COM 对象的自动化。这在 Windows7 64 位和 Windows Server 2008 R2 中完美运行。然而;常规风味 Windows Server 2008(R2 之前)完全忽略注册表中的 DllSurrogate 条目。我已经研究了几天,发现经典 Windows Server 2008 具有注册表反射的文档,如果 DllSurrogate 值为空白,则忽略它。 (我将注册表字符串的值留空以使用默认代理项。)要解决此未反映的问题(未在 32 位和 64 位注册表之间复制),我运行 regedit.exe*32 并设置密钥。然后我打开正常的注册表并设置密钥。仍然没有运气。我还尝试将 DllSurrogate 注册表值设置为 c:\windows\syswow64\dllhost.exe 以便该值不为空但根本不起作用(在任何操作系统上)。我收到的错误是“无法创建 activex 对象。”

我在 2 台不同的 Windows Server 2008 (Pre R2) 机器上重现了该问题。我还验证了从 32 位应用程序启动时,COM 对象可以在这些机器上使用。我使用 LINQPad 32 位和 64 位进行测试。作为 32 位运行的 LINQPad 可以创建 COM 对象。 64 位 LINQPad 不能。

[link text][1] http://msdn.microsoft.com/en-us/library/aa384253(VS.85).aspx

任何想法我在这里缺少什么?在 pre-R2 上使用默认的 DllSurrogate (dllhost.exe) 是否有一些特殊的技巧?将我们的 COM 重写为 .NET 目前不是一种选择。我希望我只是遗漏了一些东西,因为这确实适用于最新的 Windows Server 2008 R2。

感谢您的观看! 丹尼

【问题讨论】:

  • 您是否尝试过使用 64 位 Regedit 并编辑 HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\AppId ?
  • 是的,但没有运气。它在 64 位 regedit 和 32 位 regedit 中接受并显示 AppId(我设置为我的 COM 的 GUID)。它似乎忽略了价值。 DLLHost.exe 永远不会出现在任务管理器中。感谢您的建议。
  • 我找到了线索。 DllHost.exe 在我创建对象时确实会启动,但它是 64 位 DllHost.exe。有什么方法可以告诉它在 C:\windows\syswow64\ 中使用 32 位?

标签: com windows-server-2008


【解决方案1】:

问题解决了!感谢汉斯让我走上正轨!我不小心将系统配置为使用 64 位 DLLHost.exe 文件,因为它无法启动 32 位 COM 对象,所以它不起作用。

从头到尾,以下是我如何在 64 位应用程序中使用我的 32 位 COM 对象。

  1. 使用 regedit*32 注册 COM 对象 (c:\windows\syswow64\regedit)

  2. 进行以下注册表更改。请务必将其全部放在 Wow6432Node 下,以便使用 32 位 DLLHost。

  3. 通过在注册表中搜索类名来确定 COM 对象的 GUID。 IE。 Classname 将是您传递给 createobject 的值,例如 CreateObject("classname")。

  4. 找到现有密钥HKey_Classes_Root\Wow6432Node\CLSID\[GUID]。 添加一个名为 AppID 的新 REG_SZ(字符串)值,并将 COM 对象 GUID 作为值。

  5. 添加新密钥HKey_Classes_Root\Wow6432Node\AppID\[GUID]。 在这个新键下,添加一个名为 DllSurrogate 的新 REG_SZ(字符串)值。将该值留空。

  6. 如果还没有,请在 HKey_Local_Machine\Software\Wow6432Node\Classes\AppID\[GUID] 下创建新密钥。 如果还没有,请在此键下添加一个名为 DllSurrogate 的新 REG_SZ(字符串)值。将该值留空。

现在,当您创建 COM 对象时,您应该会在任务管理器中看到 DLLHost.exe*32。打开任务管理器的命令行栏,应该会看到C:\windows\syswow64\dllhost.exe /processid:{YourCOMGUIDHere}

【讨论】:

  • 我遇到了与原始问题完全相同的问题,但按照这些步骤操作对我不起作用。 DLLHost.exe 仍然作为 64 位进程出现,我无法从 32 位 COM dll 加载任何类。为了让它发挥作用,您还需要采取什么其他步骤吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-29
  • 2014-11-25
  • 1970-01-01
  • 2013-07-30
相关资源
最近更新 更多