2013-04-17 51 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