0

音楽を含むフォルダーを管理するために、C# で WMPLib.IWMPFolderMonitorServices を作成するコードをフローしてみます。

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);

および例外:

値を null にすることはできません。パラメータ名: o

2 番目の try ブロックで。この例外をGoogleで検索しましたが、修正できません。

4

2 に答える 2

0

COM には「インターフェイスのインスタンスを作成する」というようなものはありません。せいぜい、たまたまインターフェイスを実装するクラス (オブジェクト) のインスタンスを作成する程度です。私は衒学的ではありません。それは重要な違いです。

必要なインターフェイスを知っていても (おそらく、そのインターフェイスで宣言されたメソッドを呼び出したいため) 、それを実装するオブジェクトを取得する方法については何もわかりません。おそらく、CoCreateInstance() を呼び出します。または、最初に取得する必要がある他のオブジェクトで「GetMonitoringServices()」メソッドを呼び出すこともできます。または、インターフェイス ポインターをパラメーターとして受け取るコールバック関数ポインターを使用して、"Subscribe()" メソッドを呼び出す必要があるかもしれません。知らない。調べるには、クラス ライブラリのドキュメントを読む必要があります。

WMP 自動化については何も知りませんが、IWMPFolderMonitorServices のドキュメントから始めて、道をたどるのは難しくありません。

このインターフェイスを使用するには、Windows Media Player 11 コントロールのリモート インスタンスを作成する必要があります。リモート処理の詳細については、「Windows Media Player コントロールをリモート処理する 」を参照してください。

(おそらく、引用にリンクされているそのページも読む必要があります)

と:

IWMPPlayer を介して QueryInterface を呼び出して、IWMPFolderMonitorServices へのポインターを取得します。

Ok。IWMPPlayerのドキュメントを見る:

COM CoCreateInstance メソッドを呼び出して、IWMPPlayer インターフェイスへのポインターを取得します。

つまり、コードは次のようになります。

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

私はコードをテストしていません。詳細の一部がオフになっている可能性があります (名前空間など)。しかし、あなたはその考えを理解します。

最後に、最初のリンクに注意してください。

IWMPFolderMonitorServices インターフェイスは廃止されました。

インターフェイスが廃止された理由を調査して理解する必要があります。インターフェースがまだ存在していても使用できない可能性があります。または、それが公開する機能が最新バージョンの Windows で永久に無効になっていること。または、WMP の次のバージョンではまったく実装されません。

于 2013-04-18T13:47:51.907 に答える
0

Media Player のインスタンスを作成する必要がある場合は、次のようにします。

WindowsMediaPlayerClass wmp = new WindowsMediaPlayerClass();

WMPLib をインポートすると、WindowsMediaPlayerClass が作成されます。

于 2013-04-18T12:26:00.653 に答える