我有一个MFC应用程序,它为应用程序公开了一堆OLE对象,并打开文档。
我可以使用应用程序类的GUID连接到服务器(例如:在ruby for windows:WIN23OLE.new('{12345678-1234-1234-1234-12345678}')
)但是当我尝试使用类名WIN32OLE.new('MyApp.Application')
进行连接时,它总是失败并且“无效的类字符串”错误(HRESULT错误代码:0x800401f3)。同样的事情发生了
MFC应用程序中的OLE初始化没有返回任何错误,一旦通过GUID建立连接,它就可以正常工作。
我真的很好奇为什么类字符串方法不起作用。有什么想法吗?
答案 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