COM ラッパーを使用して Windows Media Player とやり取りしています。
AxHost を使用してプレーヤーを何らかの方法でラップしています。私にとっては、すべて内部の魔法にすぎません ^^
AxHost.AttachInterfaces は次のようになります。
protected override void AttachInterfaces()
{
try
{
//Get the IOleObject for Windows Media Player.
IOleObject oleObject = this.GetOcx() as IOleObject;
//Set the Client Site for the WMP control.
oleObject.SetClientSite(this as IOleClientSite);
Player = this.GetOcx() as WMPLib.WindowsMediaPlayer;
...
この AxHost を Windows フォーム コントロールでホストしている限り、すべてが機能しています。しかし、コンストラクターでイベントをフックすることはできません。
たとえば、これは機能しません。
public WMPMediaRating()
{
var remote = new WMPRemote.RemotedWindowsMediaPlayer();
_WMP = remote.Player;
_WMP.MediaChange += new _WMPOCXEvents_MediaChangeEventHandler(_WMP_MediaChange);
}
remote.Player は常に null であり、プログラムは NullReferencesException でクラッシュします。
AttachInterfaces() のコードは、フォームが描画された後、または他のすべてが完了した後にのみ実行されます。
手で AttachInterfaces() を呼び出してみましたが、GetOcx() が何も返さないため、それも機能しませんでした。
では、コンソール アプリケーションなどで使用するために、Windows フォームを使用せずに AxHost を継承したコントロールをインスタンス化するにはどうすればよいでしょうか。