2013-04-17 50 views
1

你好,我得到了以下异常。创建COM对象

Retrieving the COM class factory for component with CLSID {6BF52A4F-394A-11D3-B153-00C04F79FAA6} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

当我尝试创建与流代码(在C#)○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); 
+0

COM区分类和接口。就像.NET一样,你不能创建一个接口的实例。你的代码没有任何意义,它只是一个断言'Type type = typeof(WMPLib.IWMPPlayer)'。尝试使用后期绑定,然后仍然使用早期绑定的接口类型也没有意义。我看不到这个代码的意图。使用ProgId进行后期绑定。 –

+0

我在代码上得到异常:instancePlayer = Activator.CreateInstance(type); – Longit644

+0

当然可以。你想创建一个接口的实例,而不是实现。你的框架如何知道你想要哪个实现?你如何想象一个像'var object = Activator.CreateInstance(typeof(IDisposable));'应该工作吗? –

回答

1

COM使用GUIDs来识别类和接口。看起来您正在使用名为IWMPPlayer的接口ID(IID),而不是类ID(CLSID)。查看是否可以找到播放器对象的相应类,并使用该对象的GUID

更新:我看了你的课。获取CLSID这样的...

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

...然后通过这个CLSIDType.GetTypeFromCLSID

更新2:我可以检查一下,你确实需要使用这些GUID吗? 为什么不只是做...

instancePlayer = new WMPLib.WindowsMediaPlayer(); 

...?

+0

您能否详细说明它? – Longit644

+0

查看更新的答案。 – Martin

+0

但我想从WMPLib.IWMPPlayer对象 – Longit644