如何在Windows Server 2008上使用32位COM对象(适用于2008 R2但非2008)

时间:2010-10-28 14:39:54

标签: com windows-server-2008

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

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

[link text] [1]< - 我正在使用的解决方案(适用于R2) http://msdn.microsoft.com/en-us/library/aa384253(VS.85).aspx< - DllSurrogate注册表项未反映在Windows Server 2008上的文档,但我不知道如何规避此限制。我尝试使用regedit.exe * 32直接编辑32位注册表。

我在这里缺少什么想法?是否有一些特殊的技巧在R2之前使用默认的DllSurrogate(dllhost.exe)?目前不能将我们的COM重写为.NET。我希望我只是遗漏了一些东西,因为它可以在最新的Windows Server 2008 R2上运行。

谢谢你看看! 丹尼

1 个答案:

答案 0 :(得分:12)

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

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

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

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

  3. 通过搜索classname的注册表来确定COM对象的GUID。即。 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(字符串)值。将值保留为空。

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