2009年2月18日水曜日

解決

直前のエントリの問題は解決。
クラスをpublicにしていないだけだった。良かった良かった。

後は、
http://blogs.msdn.com/adam_nathan/archive/2005/10/24/using-com-interop-to-create-a-wpf-visualization-for-windows-media-player.aspx
にある。
Although IWMPEffects has several members, the most important one is Render. Windows Media Player calls your Render method regularly, giving you data about the audio, a handle to the device context (HDC) on which you need to draw, and a rectangle defining the bounds. Since WPF supports interoperability with HWNDs, I first needed to get an HWND from the HDC by PInvoking to WindowFromDC. From there, I could set my UserControl as the RootVisual for the HwndSource and update the UI appropriately. I think the obvious next step is to use data binding, but for now I've left that as an exercise for the reader. :)

に従ってWPFで視覚エフェクトを実装できる。

それから、その視覚エフェクトの登録の仕方は直前のエントリで書いた方法でregasmに作ってもらった.regファイルを(多分管理者権限が必要)登録した後、さらに
http://blogs.wankuma.com/melt/archive/2008/03/12/127425.aspx
に書いてある
この Effects キーのサブキーとしてアプリ名(今回の場合は WmpTest という名前にした)があり、そのサブキーに Property というキーがあります。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MediaPlayer\Objects\Effects\WmpTest\Property

このキーの値として classid というのがあり、ここにプラグイン本体の CLSID を記述します。

WMP はこの CLSID を使って ::CoCreateInstance をするので、CLSID に対応する dll や exe のパスもレジストリに記述しておく必要があります。

もレジストリファイルで用意しておいて登録する。これで万事OKのはず。

ところで、regasmを/regfileオプションで使ったり、HKLM\...\Effects以下への登録もregファイルを用いているのは、開発環境以外でも登録が容易であるようにするため。

なまじIDEに``COM相互運用機能の登録''なんて項目がある物だから、開発環境を使わずに登録する方法が分からずに苦労してしまった。

しかしこの方法で生成されたレジストリファイルには

[HKEY_CLASSES_ROOT\CLSID\{F6ADD2D1-C4C0-4E4A-99DF-49AC5A90D23B}\InprocServer32]
@="mscoree.dll"
"ThreadingModel"="Both"
"Class"="WMPWPFTest.MyEffect"
"Assembly"="WMPWPFTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
"RuntimeVersion"="v2.0.50727"

こんな事が書いてあるんだが、これ、GACに登録しないといけないなんて事ないよな?Assembly=の部分をフルパスにすれば良いんだよな?

いずれにせよ、インストーラは簡単な物を自作しなければいけなそうだなあ。

追記:
regasm /regfile /codebase ビルドされたdll
でフルパスでアセンブリを参照するレジストリファイルが作れる。
そうやって作ったレジストリファイルを管理者権限で登録して、上に書いたようにWindows Media Playerの視覚エフェクトに関するレジストリキーも登録して、コードの方でメソッドにとりあえずMessageBox.Show("Called!")とか書いておいたら、ちゃんと呼ばれた。良かった、良かった。

regasmって再配布してよいのだろうか・・・。

0 件のコメント: