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

如何在Windows Server 2008上使用32位COM对象(适用于2008 R2,但不适用于2008),com,windows-server-2008,Com,Windows Server 2008,我使用默认的DllSurrogate来启用64位中32位COM对象的自动化。这在Windows7 64位和WindowsServer2008R2中非常有效。然而;常规Windows Server 2008(R2之前版本)完全忽略注册表中的DllSurrogate项。我已经研究了好几天了,发现有文档表明经典的Windows Server 2008具有注册表反射,如果DllSurrogate值为空,则会忽略该值。(我将注册表字符串的值保留为空以使用默认代理。)要解决此问题,请运行regedit.ex

我使用默认的DllSurrogate来启用64位中32位COM对象的自动化。这在Windows7 64位和WindowsServer2008R2中非常有效。然而;常规Windows Server 2008(R2之前版本)完全忽略注册表中的DllSurrogate项。我已经研究了好几天了,发现有文档表明经典的Windows Server 2008具有注册表反射,如果DllSurrogate值为空,则会忽略该值。(我将注册表字符串的值保留为空以使用默认代理。)要解决此问题,请运行regedit.exe*32并设置键。然后我打开普通regedit并设置关键点。还是不走运。我还尝试将DllSurrogate注册表值设置为c:\windows\syswow64\dllhost.exe,这样该值就不是空的,但根本不起作用(在任何操作系统上)。我收到的错误是“无法创建activex对象”

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


[链接文本][1]问题已解决!谢谢汉斯让我走上正轨!我意外地将系统配置为使用64位DLLHost.exe文件,该文件无法运行,因为它无法启动32位COM对象

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

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

  • 进行以下注册表更改。确保将所有这些都放在Wow6432Node下,以便使用32位DLLHost

  • 通过在注册表中搜索classname来确定COM对象的GUID。Classname是传递给createobject的值,比如createobject(“Classname”)

  • 找到现有密钥
    HKey\U Classes\U Root\Wow6432Node\CLSID\[GUID]
    。 添加一个名为AppID的新REG_SZ(字符串)值,该值使用COM对象GUID作为值

  • 添加新密钥
    HKey\U Classes\U Root\Wow6432Node\AppID\[GUID]
    。 在这个新键下,添加一个名为DllSurrogate的新REG_SZ(字符串)值。将该值保留为空

  • 如果尚未存在,请在
    HKey\u Local\u Machine\Software\wow6432 node\Classes\AppID\[GUID]
    下创建新密钥。 如果还没有,请在此键下添加一个名为
    DllSurrogate
    的新REG_SZ(字符串)值。将该值保留为空


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

    您是否尝试过使用64位Regedit和edit 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位?我的问题与原来的问题完全相同,但遵循这些步骤对我不起作用。DLLHost.exe仍然是一个64位进程,我无法从32位COM dll加载任何类。为了让这一切顺利进行,你还需要采取其他措施吗?