当ブログはCOMをメインに扱うとは言ったが、それは俺のCOMに関する勉強を兼ねてのことであり、従って、まだCOMに関するまともな記事(ブログの記事機能ではなく静的サイトにする予定だ)を一つも書いていない現状では、俺はCOMに対するロクな知識を持っていないということが帰結される。
というわけで教えてぷりーづ(以下の文章に間違いがあったらご指摘願いたい)。
COMの(正確にはDCOMの)特徴の一つに、ローカル/リモート透過性がある。コンポーネントの実体がどこ(自アパートメント内/自プロセス内/自マシンの他プロセス内/他マシン内)にあるかを意識することなく、そのコンポーネントのメソッドを呼び出せる。
これは、アパートメント境界を超えるときにはプロキシとスタブというペアが働くためだ。プロキシは自アパートメント内にあって、他アパートメントにあるコンポーネントへ要求を送り出す役割を果たし、スタブは相手のコンポーネントと同じアパートメント内にあって、プロキシから受け取ったデータをコンポーネントに渡す役割を持つ。戻り値も同様の経路で中継される。
プロキシ/スタブのペアが行うこのデータ中継を「マーシャリング」と呼ぶ。
だが、プロキシ/スタブが存在しないインターフェイスもある。そういったインターフェイスは、IDLでlocal属性をつけて定義する。
ここで、コンポーネントではなくインターフェイスに制約が課されるというのは興味深い。
COMにとってコンポーネントとは隠すべき実装詳細であり、コンポーネントがある場所も実装詳細であるにも関わらず、local属性はインターフェイスによって表明される。
これは、マーシャリングに関する知識を持っているのが、コンポーネントではなくインターフェイスだからである。
これは、同じインターフェイスを実装するすべてのコンポーネントは、同じプロキシ/スタブを利用することを意味する。
さて、本題。
限定的ローカルリソース(と、即興で今命名した)リソースを扱うコンポーネントを作るにはどうしたらよいのだろうか。
例えば、自プロセス内でしか有効でないリソース(GDIオブジェクトを含むものとか)や、自マシン内でしか有効でないリソース(ファイルなど)である。
前者はアパートメントを越えて有効であるし、後者はプロセスを越えて有効であるが、いずれも越えられない壁がある。
このため、マーシャリングは必要(よって、プロキシ/スタブも必要で、インターフェイスはlocal指定できない)なのだが、しかし、そういった限定的なマーシャリングのみを許可するプロキシを作ることはできるのだろうか。あるいは、IMarshalのカスタム実装が必要になるのだろうか(プロセスローカルリソースはFTMが使えるかもしれないが)。
こういったローカル/リモート透過性を持たないリソースを扱うにはCOMは適さないという結論にならないことを祈るばかりである。