SO に関する他の質問から、現在再生中の曲を Windows Media Player と Zune から取得する方法を尋ねたところ、C++ 開発者から回答があり、WMP でこれを行う方法について説明してくれました。
ただし、私は C++ 開発者ではなく、pywin32 ライブラリの経験も豊富ではありません。それに加えて、これらすべて (特に WMP に関する) に関するドキュメントはひどいものです。
そのため、Python で次のことを行う方法を理解していただく必要があります。
現在 WMP で再生中のメディアの名前を出力する C++ の作業コードがあります。シンプルなコンソール アプリケーション (78 行のコード) です。
手順:
1) IUnknown、IOleClientSite、IServiceProvider、および IWMPRemoteMediaServices を実装する基本的な COM オブジェクトを実装します。これは、ATL テンプレート CComObjectRootEx を使用して簡単に行うことができます (実際の距離は異なる場合があります)。(単純な) コードを必要とする唯一のメソッドは、IServiceProvider::QueryService と IWMPRemoteMediaServices::GetServiceType です。他のすべてのメソッドは E_NOTIMPL を返す場合があります
2)「WMPlayer.OCX」COMオブジェクトをインスタンス化します(私の場合、CoCreateInstanceを介して)
3) QueryInterface を介して、オブジェクトから IOleObject インターフェイス ポインターを取得します。
4) 1) で見たクラスからオブジェクトをインスタンス化します (私は CComObject<>::CreateInstance テンプレートを使用します)
5) 3) で取得したインターフェイスから SetClientSite メソッドを使用し、OleClientSite 実装へのポインターを渡します。
6) SetClientSite の呼び出し中に、WMP はコールバックします。最初に IServiceProvider インターフェイス ポインターを要求し、次に QueryService メソッドを呼び出して、IWMPRemoteMediaServices インターフェイス ポインターを要求します。IWMPRemoteMediaServices の実装を返します。3 番目に、GetServiceType を介して再度呼び出されます。次に、「リモート」を返す必要があります。これで、WMP 実行中のインスタンスに接続されました
7) IWMPMedia インターフェイス ポインターの COM オブジェクトをクエリします。
8) 7) で NULL が返されなかった場合は、IWMPMedia::name プロパティを読み取ります。
9)完了
上記のすべては、VS2010 / Windows Seven で、WMP を実行してテストされました (Media Player プロセスが実行されていない場合は、何もしないでください)。
Python で COM インターフェイスとオブジェクトを実装できるかどうか、または実装したいかどうかはわかりません。私の C++ コードに興味がある場合は、お知らせください。そのコードを C++ DLL で使用して、Python から呼び出すことができます。
win32api について少し知っています。
最初のステップでは、何をすべきか本当にわかりません.IOleClientSiteをグーグルで検索すると、msdnドキュメントが表示されます。これはインターフェイスです。しかし、それは私がすでに立ち往生しているところです。Pythonでこれらのものを操作することについて、何も見つかりません(私の恐ろしいグーグルスキルかもしれません)。
2 番目のステップ:
WMP = win32com.client.Dispatch("WMPlayer.OCX")
わかりました、それは実行可能です。
第三段階へ。QueryInterface -
「所有しているオブジェクトに関係なく、いつでもその QueryInterface() メソッドを呼び出して、IStream などの新しいインターフェイスを取得できます。」
しかし、私にとってはそうではありません。彼の説明を理解しているので、すべての com オブジェクトが IUnknown から 3 つのメソッドを「継承」することを意味すると思います。そのうちの 1 つは QueryInterface ですが、WMP
オブジェクトで QueryInterface を呼び出すと惨めに失敗するため、そうではないようです。(Object has no attribute 'QueryInterface')
私はとりとめのないこともできますが、あなたは要点を理解していると思います。これをどう扱うかわかりません. 誰でもこれで私を助けることができますか?コード例が望ましいですが、リソース/ドキュメントも歓迎します。