【问题标题】:COM/OLE can connect by GUID but not by class stringCOM/OLE 可以通过 GUID 连接,但不能通过类字符串连接
【发布时间】:2011-11-21 01:48:39
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: com ole


    【解决方案1】:

    类字符串称为 ProgID(programmatic 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 的更多信息:

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

    【讨论】:

    • 我认为它们只需要在注册表中就可以由 COM 启动应用程序。或者,应用程序可以在启动时向系统注册,然后变得可用。该程序的安装程序会为关联的 DLLS(均按类字符串/ProgID 工作)创建注册表项,但不会为主可执行文件创建注册表项。感谢您的信息!
    猜你喜欢
    • 1970-01-01
    • 2018-03-20
    • 2020-12-25
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 2015-10-17
    • 2015-12-24
    • 2016-11-28
    相关资源
    最近更新 更多