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

5
我正在使用默认的DllSurrogate,在64位中启用32位COM对象的自动化。在Windows7 64位和Windows Server 2008 R2上,这个方法完美运行。然而,在普通版本的Windows Server 2008(R2之前),它完全忽略了注册表中的DllSurrogate条目。我研究了几天,并发现经典的Windows Server 2008有一个注册表反射机制,如果其为空,则会忽略DllSurrogate值。(我将注册表字符串的值留空以使用默认代理。)为了解决这个问题,我运行regedit.exe*32并设置键。然后我打开正常的regedit并设置键。仍然没有成功。我还尝试将DllSurrogate注册表值设置为c:\windows\syswow64\dllhost.exe,以使值不为空,但这在任何操作系统上都不起作用。我收到的错误是“无法创建ActiveX对象”。
我已经在两台不同的Windows Server 2008(Pre R2)机器上重现了问题。 我还验证了当从32位应用程序启动时,COM对象可以在这些机器上使用。 我使用LINQPad 32位和64位进行测试。 运行为32位的LINQPad可以创建COM对象。 64位LINQPad则不能。
[link text][1] <-- 我正在使用的解决方案(适用于R2) http://msdn.microsoft.com/en-us/library/aa384253(VS.85).aspx <-- 文档指出,在Windows Server 2008上未反映DllSurrogate注册表条目,但我不知道如何规避此限制。 我尝试使用regedit.exe * 32直接编辑32位注册表。
有什么想法吗? 在Pre-R2上使用默认的DllSurrogate(dllhost.exe)是否有一些特殊技巧? 目前,将我们的COM重写为.NET不是一个选项。 我希望我只是错过了什么,因为这确实在最新的Windows Server 2008 R2上运行。

谢谢查看! 丹尼


你尝试过使用64位的Regedit并编辑HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\AppId吗? - Hans Passant
是的,但没有运气。它在64位和32位注册表中都接受并显示了AppId(我将其设置为我的COM的GUID)。它似乎忽略了该值。 DLLHost.exe从未出现在任务管理器中。感谢您的建议。 - Danny
我找到了一个线索。当我创建对象时,DllHost.exe确实启动了,但它是64位的DllHost.exe。有没有办法告诉它使用C:\windows\syswow64\中的32位文件? - Danny
1个回答

14

问题解决了!感谢汉斯让我找到正确的方向!我不小心配置了系统使用64位的DLLHost.exe文件,这不起作用,因为它无法启动32位的COM对象。

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

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

  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(字符串)值。保留值为空。

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


我遇到了与原问题完全相同的问题,但是按照这些步骤并没有解决我的问题。DLLHost.exe仍然作为64位进程出现,我无法加载32位COM dll中的任何类。您还需要采取其他步骤才能使其正常工作吗? - Dan Ling

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