Chapter.2

モニカ


2004/6/24
 ・サンプルソースで、構造体変数をNewで初期化しているものをNewしないように修正。

モニカはCOMアーキテクチャの中では重要な概念の1つなのですが、あまり理解されていない部分だと思います。 しかし、私の考えでは、カスタムモニカを実装しない限り、モニカの内部まで理解する必要はないと考えています。 使う分には使い方だけ知っていれば十分です。

よく聞かれる「モニカとは何なのか?」という問に対しては、「クラスファクトリを補うものである」と答えることが出来ます。 これだけ聞いても何のことかよく分からないと思います。そこで思い出して欲しいのですが、 前回と前々回のサンプルでは拡張子に対応するOLEサーバを検索する機能を実装しています。 正にそれがモニカの仕事であると言えます。
つまり我々は、モニカのする仕事を肩代わりしてしまったのです。



前述のモニカ(これもモニカの一側面に過ぎないが)は、.NET FrameworkにおいてSystem.Runtime.InteropServices.Marshal.BindToMonikerという静的関数に実装されています。 この関数の動作は、ファイルの拡張子からProgIDを取得し、それをCLSIDに変換してCoCreateInstanceを呼び出すことです。 ドキュメントを詳細に読むと、これはCOMのAPIであるBindMonikerを呼び出しているという話なので、私もそれに習って同等の処理を作ってみました。
なお、モニカに使用されるインターフェース(IMonikerIBindCtx)は、.NET Frameworkでも定義されており、 それぞれSystem.Runtime.InteropServices.UCOMIMonikerSystem.Runtime.InteropServices.UCOMIBindCtxとなっています。 この事実を見る限り、.NET Frameworkにおいてもモニカが重要であることがわかると思います。 実際には、現在のWindowsシェルはCOMに依存している部分が大きく、完全にCOMを排除するのは難しいという問題を抱えているということです。これは将来のバージョンのWindowsでは、変更されると考えるべきです。



単純に実装しただけでは、面白くないのでURLにも対応してみました。インターネットで公開されているOLEファイルをURLで開くことが出来ます。 当然、OLEサーバの実装によっては出来ないこともあります。
PDFはURLでは駄目でしたが、ワード文書はURLでも可能でした。
VB.NETサンプルソース:chap2.vb.lzh(18KB未満 2004/06/24)

今回は、.NET Frameworkにインターフェースが定義されていたので、作成は楽でした。
これでモニカの使い方が分かって頂けたか、多少の不安は残りますが、 モニカは以降の章でも出てくることがあるので、出てくるたびに理解を深めていけば良いと思います。


前へ 次へ
OLE on .NET Frameworkへ
総合トップへ