COM / OLE可以通过GUID连接,但不能通过类字符串连接

时间:2011-11-21 01:48:39

标签: com ole

我有一个MFC应用程序,它为应用程序公开了一堆OLE对象,并打开文档。

我可以使用应用程序类的GUID连接到服务器(例如:在ruby for windows:WIN23OLE.new('{12345678-1234-1234-1234-12345678}'))但是当我尝试使用类名WIN32OLE.new('MyApp.Application')进行连接时,它总是失败并且“无效的类字符串”错误(HRESULT错误代码:0x800401f3)。同样的事情发生了

MFC应用程序中的OLE初始化没有返回任何错误,一旦通过GUID建立连接,它就可以正常工作。

我真的很好奇为什么类字符串方法不起作用。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

类字符串称为ProgID(程序ID的缩写),它实际上只是ClassID的人类可读版本。 ProgID存储在HKEY_CLASSES_ROOT下的注册表中,例如从我的注册表中随机选择一个:

HKEY_CLASSES_ROOT\Microsoft.XMLDOM

在此键下有另一个名为CLSID的键:

HKEY_CLASSES_ROOT\Microsoft.XMLDOM\CLSID

键是包含ClassID的REG_SZ值:

{2933BF90-7B36-11D2-B20E-00C04F983E60}

所以基本上它的工作方式是COM将尝试在指定的ProgID下的注册表中找到CLSID。我猜它不在那里,或者某种方式无法进入。如果你想确定一下,请打开REGEDIT.EXE并查看预期的注册表设置是否存在。如果它们不是,那么你的答案是关于它为什么不起作用(由于某种原因,COM组件的注册没有创建ProgID键)。

如果有设置,我建议运行Process Monitor(sysinternals.com)并设置一些注册表过滤器,以查看在扫描注册该ProgID时发生的情况。

以下是有关ProgIDs的更多信息:

http://msdn.microsoft.com/en-us/library/windows/desktop/dd542719(v=vs.85).aspx