【发布时间】: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 编写的)