【问题标题】:Create Com object创建 Com 对象
【发布时间】:2013-04-10 06:18:22
【问题描述】:

您好,我遇到了以下异常。

检索具有 CLSID {6BF52A4F-394A-11D3-B153-00C04F79FAA6} 的组件的 COM 类工厂失败,原因是以下错误:80040154 未注册类(来自 HRESULT 的异常:0x80040154 (REGDB_E_CLASSNOTREG))。

当我尝试使用流代码(在 c# 中)创建 o COM 对象时

Object instancePlayer = null;
Guid guid_IWMPPlayer = typeof(WMPLib.IWMPPlayer).GUID;
Guid guid_IUnknown = new Guid("00000000-0000-0000-C000-000000000046");
Type type = Type.GetTypeFromCLSID(guid_IWMPPlayer);
instancePlayer = Activator.CreateInstance(type);

【问题讨论】:

  • COM 区分类和接口。就像 .NET 一样,您不能创建接口的实例。您的代码没有任何意义,这只是说Type type = typeof(WMPLib.IWMPPlayer) 的一种错误方式。尝试使用后期绑定然后仍然使用早期绑定的接口类型也没有意义。我看不到这段代码的意图。使用 ProgId 进行后期绑定。
  • 我在代码中遇到异常:instancePlayer = Activator.CreateInstance(type);
  • 你确定。您想创建接口的实例,而不是实现。您的框架如何知道您想要哪种实现?你认为像var object = Activator.CreateInstance(typeof(IDisposable)); 这样的行应该如何工作?
  • 您是否有机会在 64 位中运行您的代码并尝试激活仅 32 位的东西?我怀疑 Windows Media Player 有 64 位版本,但仔细检查并没有什么坏处。我从 64 位 LinqPad 测试 COM 组件时遇到了同样的异常,直到我意识到它是一个旧的仅 32 位 COM 组件(我用 Delphi 7 编写的)

标签: c# com wmplib


【解决方案1】:

COM 使用GUIDs 来标识类和接口。看起来您正在使用名为 IWMPPlayer 的接口 ID (IID) 而不是类 ID (CLSID)。看看你能不能找到一个对应的播放器对象的类,并使用它的GUID

更新:我为你查了课程。像这样获取CLSID...

Guid guid_WMPPlayer = typeof(WMPLib.WindowsMediaPlayer).GUID;

...然后将此CLSID 传递给Type.GetTypeFromCLSID

更新 2:我可以检查一下,您肯定需要使用这些 GUID 吗? 为什么不干...

instancePlayer = new WMPLib.WindowsMediaPlayer();

...?

【讨论】:

  • 你能说的更详细一点吗??
  • 但我想从 WMPLib.IWMPFolderMonitorServices 对象创建一个 WMPLib.IWMPFolderMonitorServices 对象
  • 这听起来像是一个单独的问题;你之前没提过。我的回答是否解决了您发布的问题?
  • 对不起。在这段代码之后,我想通过 IWMPPlayer 调用 QueryInterface 来检索指向 IWMPFolderMonitorServices 的指针,但我在这里得到了异常
  • 无需道歉。只需发布另一个问题,解释您尝试了什么,并显示您得到的错误。就像你对这个问题所做的那样:-)
猜你喜欢
  • 1970-01-01
  • 2011-03-05
  • 2018-03-13
  • 1970-01-01
  • 2011-09-10
  • 2013-07-19
  • 2018-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多