【发布时间】: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 位?