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

COM/OLE可以通过GUID连接,但不能通过类字符串连接,com,ole,Com,Ole,我有一个MFC应用程序,它为应用程序公开了一堆OLE对象,并打开了文档 我可以使用应用程序类的GUID连接到服务器(例如:在ruby for windows中:WIN23OLE.new({12345678-1234-1234-1234-12345678}')),但是当我尝试使用类名WIN32OLE.new('MyApp.application'))连接时,总是会出现“无效的类字符串”错误(HRESULT错误代码:0x800401f3)。同样的事情也会发生 MFC应用程序中的OLE初始化没有返回错

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

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

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


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

类字符串称为ProgID(prographic 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时发生的情况

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


我认为他们只需要在注册表中,COM就可以启动应用程序。或者,应用程序可以在启动时在系统中注册,然后变得可用。此程序的安装程序为相关DLL(所有DLL均按类字符串/ProgID工作)创建注册表项,但不为主可执行文件创建注册表项。谢谢你的信息!