Chapter.20.1
アウトプロセスサーバ(2)
1.CCWの問題点
某掲示板でCCWを通じてアンマネージコード側に参照させているオブジェクトで、最後の
IUnknown.Releaseが呼び出されたことを検出する方法は無いか?という質問があったのですが、私の調べた限り.NET Framework 2.0までのCCWでこれを直接検出する方法はありませんでした。
ただ、幸い(?)なことに掲示板の事例ではプロセス間マーシャリングを行っているため、外部プロセスからの参照をカウントする
IExternalConnectionインターフェースを実装することにより、プロセス外クライアントの切断を検出することができます。このインターフェースの本来の目的はアウトプロセスサーバの内部参照と外部参照を区別することですが、思わぬところで用途があったと言うところでしょうか?COMの世界でも、プロセス外からの参照をカウントするのは難しいと言うことは確かです。私が作成したMother2.1のCOMオブジェクトには全てこのインターフェースを実装しています。
2.サンプル
掲示板の質問に答えるため速度を重視して検証プログラムを作成したため、残念ながらVB.NET用サンプルはありません。
C#サンプルソース:chap20_1.lzh (39KB 2007/5/26)
さらにデバッグを円滑にするため、Visual Studio 2005用ソリューションとして作成しています。圧縮ファイルにはソリューションとプロジェクトをそのまま格納しているので、ディレクトリ構造を維持した状態で解凍してください。また、サンプルを実行するためにSQL Serverが必要になります。
ドラッグ&ドロップのデータ転送中にクライアント側のプロセスを強制終了した場合、
IExternalConnection.ReleaseConnectionが呼び出されません。これはローカルサーバの実装上対処のしようが無い問題ですので、外部参照させるコンポーネントは基本的にポーリングにより状態を監視する必要があります。ただし、リモートサーバの場合はこの限りではありません。
3.まとめ
作成した検証プログラムが惜しいので公開してみました。アウトプロセスサーバにおけるTIPS的なものと言うことでご勘弁を。
なお、インプロセスサーバでは、
IExternalConnectionインターフェースは使えないため、別の方法を考える必要があります。多分、以下の二つになると思いますが・・・
- CCWを使用しない
- System.Runtime.InteropServices.StandardOleMarshalObjectとカスタムマーシャラによる併せ技
まぁ、これらの実装が必要とされる状況ならば、素直にC++/CLIを使用するべきです。
前へ 次へ
OLE on .NET Frameworkへ
総合トップへ
サンプルで使用しているキーワード
CFSTR_FILECONTENTS
CFSTR_FILEDESCRIPTOR
DoDragDrop
FILEDESCRIPTOR
FILEGROUPDESCRIPTOR
FORMATETC
IDataObject
IDropSource
IEnumFORMATETC
IExternalConnection
STGMEDIUM
System.Runtime.InteropServices.ComTypes.IStream