2004年09月15日
AxWebBrowserをサムネール表示に使う
http://www11.plala.or.jp/acaccelerator/programming/cstips.html#DrawWebBrowserImage
このサンプルからはいくつかのTipsが分かった。
- C# の ActiveX ラッパー AxHost クラスには GetOcx() という関数があり、ActiveX コントロールを表すオブジェクトを取得できる。
- System.Runtime.InteropServices.Marshal のstatic関数 GetIUnknownForObject 関数を使えば、IUnknown を取得できる。
- System.Runtime.InteropServices.Marshal には他にも AddRef・QueryInterface・Release などがあって、生の COM を直接扱うことができそうだ。
- OleDraw 関数を使えば、ActiveX コントロールをHDCに描画できる
また、COM 相互運用性 第 1 部:C# クライアント チュートリアル(MSDN) によると、COM クラスラッパーさえ作っておけばキャストで QuerryInterface できたり、new で CreateInstance できるようだ。
VC#.NET では、全ての ActiveX コントロールを AxHost の継承クラスとして扱えて便利だし分かりやすいのだけど、COM を直接扱うには生でするしかないのだろうか。例えば、AxHost クラスに GetUnknown とか QueryInterface が実装されていたら分かりやすかっただろうし、COM を表すオブジェクトをキャストすれば QueryInterface したことになってくれるなら分かりやすい。
この辺、調査できていないので、要調査。System.Runtime.InteropServices を眺めていると、あまりきれいに体系化されていなさそうで、嫌な予感がする・・・。解説はMSDNの「.NET Framework→.NET Frameworkを利用したプログラミング→アンマネージコードとの相互運用→高度なCOM相互運用機能」あたりにあるようだ。