【问题标题】:CLSIDFromProgID is successful but CreateInstace fails! Why?CLSIDFromProgID 成功但 CreateInstace 失败!为什么?
【发布时间】:2010-09-20 13:44:25
【问题描述】:

我正在尝试创建一个 COM 对象的实例。我有实现接口的类名,并通过使用 CLSIDFromProgID() 获得 CLSID。因此,由于我获得了 CLSID,我认为从现在开始一切都会好起来的。但是,当我调用 CreateInstance 并传入 CLSID 时,我收到一条错误消息,提示“类未注册”。此外,我仅在某些计算机中收到此错误。它在多台计算机上运行无错误。我不明白问题可能出在哪里。我的注册表脏了吗?有谁知道这里发生了什么?感谢您的帮助!

我只想补充一点,这是一个 .NET COM 类。相应的条目在注册表中,DLL 在 GAC 中。

【问题讨论】:

    标签: com registry createinstance clsid clsidfromprogid


    【解决方案1】:

    CLSIDFromProgId 只是在注册表中查找 ProgId 的名称并将其转换为 CLSID,它无需查看注册表之外的任何内容,甚至无需检查是否有某些东西实际实现了该 CLSID。

    当您在 CLSID 上调用 CreateInstance 时,Windows 将在注册表中查找对象应如何实例化(通常是 exe 或 dll)。然后它将尝试加载 dll(或启动 exe)并从中创建对象。

    MSDN 中有很多关于所涉及流程的文档,例如参见“COM Class Objects and CLSIDs”,如果您做了很多 COM 工作,那么值得向第一任负责人学习该流程,因为它可以节省大量调试此类问题的时间和麻烦。

    【讨论】:

    • 可以说它是一个 .net COM 类。那么当我调用 CreateInstance() 时它在哪里呢?
    • 查看 HKEY_CLASSES_ROOT\CLSID\{..your clsid..}\ 您应该会看到一个 Server32 或 InprocServer23 子项,它将告诉您注册了哪个可执行文件来处理该对象。 oleview 工具可用于诊断这些问题...打开 Visual Studio 命令提示符并键入:oleview
    【解决方案2】:

    这是注册表中的两步过程。您使用 ProgID 来获取 CLSID。然后,当您调用 CreateInstance 时,COM 会使用 CLSID 查找 dll 的路径。您可以自己使用 regedit 来查找 CLSID 并查看该条目的外观。

    【讨论】:

    • 可以说它是一个 .net COM 类。那么当我调用 CreateInstance() 时它在哪里呢?
    • 我相信,没有区别。 COM 是 COM。注册表将 CLSID 映射到 dll 的路径。
    【解决方案3】:

    感谢您的回答。 .Net 程序集已正确注册并存在于 GAC 中。一个绝对证实了这一点的应用程序是 Process Explorer。您可以查看每个应用程序加载的 dll。所以从这里我可以看到实例化 COM 对象的应用程序是否真的能够加载 DLL。我发现这确实发生了。问题是由于不同的区域设置。我们发现当地区没有设置为美国时,应用程序抛出了异常。此问题已修复。错误消息“类未注册”不是很有帮助。谢天谢地,这是一个快速修复。

    【讨论】:

      【解决方案4】:

      以shell32为例,可以这样新建实例;

      var shl = (Shell) Activator.CreateInstance(Type.GetTypeFromProgID("Shell.Application"));
      

      这将获得对现有组件的引用;

      var shl2 = (Shell) Marshal.GetActiveObject("Shell.Application");
      

      这里是如何在IronPython 中执行相同操作的参考。

      ** 注意,这里使用的是 progid,clsid 几乎相同,只需使用 Type.GetTypeFromCLSID({GUID})。

      【讨论】:

        猜你喜欢
        • 2010-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-25
        • 2020-12-04
        • 1970-01-01
        相关资源
        最近更新 更多