2013-04-18 116 views
0

我嘗試流動的代碼來創建一個WMPLib.IWMPFolderMonitorServices在C#中管理文件夾包含音樂。類未註冊(例外從HRESULT:0x80040154(REGDB_E_CLASSNOTREG))

public partial class MainWindow : Window 
    { 
     private WMPLib.IWMPPlayer player; 
     private WMPLib.IWMPFolderMonitorServices manageFolder; 


     [DllImport("ole32.dll", ExactSpelling = true, PreserveSig = false)] 
     [return: MarshalAs(UnmanagedType.Interface)] 
     static extern void CoCreateInstance([In, MarshalAs(UnmanagedType.LPStruct)] Guid rclsid, 
              [MarshalAs(UnmanagedType.IUnknown)] object pUnkOuter, 
              CLSCTX dwClsContext, 
              [In, MarshalAs(UnmanagedType.LPStruct)] Guid riid, 
              [MarshalAs(UnmanagedType.IUnknown)] out object rReturnedComObject); 

     public MainWindow() 
     { 
      InitializeComponent(); 

      Object instancePlayer = null; 
      Guid guid_IWMPPlayer = typeof(WMPLib.IWMPPlayer).GUID; 
      Guid guid_IUnknown = new Guid("00000000-0000-0000-C000-000000000046"); 
      try 
      { 
       CoCreateInstance(guid_IWMPPlayer, null, CLSCTX.CLSCTX_INPROC_SERVER, guid_IUnknown, out instancePlayer); 
      } 
      catch (Exception e) 
      { 
       MessageBox.Show(e.Message); 
      }    
      Type type = Type.GetTypeFromCLSID(guid_IWMPPlayer); 

      player = instancePlayer as WMPLib.IWMPPlayer; 

      Object instanceFolder = null; 
      Guid guid_IWMFolder = typeof(WMPLib.IWMPFolderMonitorServices).GUID; 
      IntPtr ptr1, ptr2; 

      try 
      { 
       ptr1 = Marshal.GetComInterfaceForObject(instancePlayer, type); 
       Marshal.QueryInterface(ptr1, ref guid_IWMFolder, out ptr2); 
       Marshal.PtrToStructure(ptr2, instanceFolder); 
      } 
      catch(Exception e) 
      { 
       MessageBox.Show(e.Message); 
      } 
      manageFolder = instanceFolder as WMPLib.IWMPFolderMonitorServices; 
     } 
    } 
} 

我得到異常:

沒有註冊類(從HRESULT異常:0x80040154的(REGDB_E_CLASSNOTREG))

在:

CoCreateInstance(guid_IWMPPlayer, null, CLSCTX.CLSCTX_INPROC_SERVER, guid_IUnknown, out instancePlayer); 

和異常:

值不能爲空。 參數名稱:o

第二次嘗試塊。 我在谷歌上搜索這個異常,但我無法修復它。

+0

CoCreateInstance的第一個參數是CLSID,而不是IID。 –

+0

你有其他方法嗎? – Longit644

回答

0

如果你只需要創建的媒體播放器的一個實例,只是這樣做:

WindowsMediaPlayerClass wmp = new WindowsMediaPlayerClass(); 

WindowsMediaPlayerClass當您導入WMPLib已創建。

+0

謝謝,但我的目標是「創建一個WMPLib.IWMPFolderMonitorServices的實例」 – Longit644

+0

這可能是你的目標,但它不是原來的問題。此界面已正式棄用,您爲什麼要使用它?你需要做什麼? –

0

在COM中沒有「創建接口的實例」這樣的事情。充其量,你創建一個類的實例(所以,一個對象),恰好實現了一個接口。我並不迂腐;這是一個重要的區別。

知道你想要的接口(大概是因爲你想調用一個在該接口中聲明的方法)告訴你絕對沒有關於如何獲得實現它的對象。也許你調用CoCreateInstance()。或者,也許你需要先調用一些其他對象的「GetMonitoringServices()」方法。或者,也許你必須用一個接收指針作爲參數的回調函數指針調用一些「Subscribe()」方法。我不知道。你必須閱讀類庫的文檔才能找到答案。

我不知道WMP自動化任何東西,但它並不難走的道路,從IWMPFolderMonitorServices documentation開始:

使用這個接口,您必須創建Windows媒體播放器的遠程的實例11控制。有關遠程處理的更多信息,請參閱Remoting the Windows Media Player Control

(你或許應該閱讀頁面的引用以及鏈接)

和:

通過IWMPPlayer調用的QueryInterface檢索指向IWMPFolderMonitorServices。

好的。縱觀IWMPPlayer documentation

var player = new WindowsMediaPlayerClass(); 
var monitoringSvc = (WMPLib.IWMPFolderMonitorServices)player; 

我的天堂:

通過調用COM CoCreateInstance的方法

這告訴我的代碼應該是這個樣子檢索的指針IWMPPlayer接口沒有測試代碼。一些細節可能關閉(名稱空間等)。但你明白了。

最後,第一個鏈接的通知:

的IWMPFolderMonitorServices接口已被棄用。

你真的應該研究和理解接口爲什麼不推薦使用。可能是界面仍然存在,但無法使用;或者它公開的功能在現代版本的Windows中被永久禁用;或者下一版WMP將不會實施它。

相關問題