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

问题描述:

我有一个MFC应用程序,它导出了一堆OLE对象,用来打开文档。我可以使用应用程序类的GUID连接到服务器(例如:ruby for windows: WIN23OLE.new(‘{12345678-1234-1234- 12345678}’),但是当我尝试使用类名WIN32OLE.new(‘MyApp.Application’)连接时,总是会出现“无效的类字符串”错误(HRESULT错误代码:0x800401f3)。同样的事情发生了在MFC应用程序中,OLE初始化没有返回错误,一旦通过GUID建立了连接,它就可以正常工作了。我很好奇为什么类string方法不能工作。有什么好主意吗?

null

解决方案:

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

HKEY_CLASSES_ROOT\Microsoft.XMLDOM

在这个键下还有一个键叫CLSID:

HKEY_CLASSES_ROOT\Microsoft.XMLDOM\CLSID

在这个键里面是一个REG_SZ值,它包含了ClassID:

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

基本上它的工作方式是COM试图在注册表中找到指定进程下的CLSID。我猜它不存在,或者因为某些原因而导致无法访问。如果你想确定答案,打开REGEDIT。并查看是否有预期的注册表设置。如果如我所料,那么就可以解释为什么它不能正常工作(由于某些原因,COM组件的注册没有创建冗长键)。

如果设置已经存在,我建议运行Process Monitor (sysinternals.com)并设置一些注册表过滤器,以查看在扫描注册表以获取该进程标识符时发生了什么。以下是关于ProgIDs的更多信息:

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

我认为它们只需要在注册表中,COM就可以启动应用程序。或者,应用程序可以在启动时在系统中注册自己,然后就可以使用它了。这个程序的安装程序为相关联的dll(这些dll都是按类string / ProgID工作的)创建注册表项,而不是为主可执行文件创建注册表项。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容