コマンドライン
DLLサーバはCOMクライアントのプロセス内で動作しますが、
EXEサーバはCOMクライアントとは独立したプロセスとして起動されます。
この違いにより、DLLサーバはCOMシステムから関数呼び出しの形で呼び出されましたが、
EXEサーバはCOMシステムからコマンドライン指定による起動という形で呼び出されます。
これらの違いをまとめると次の表になります。
呼び出しの内容 | DLLの関数 | EXEのコマンドライン |
class objectの取得 | DllGetClassObject | /embedding |
DLLの解放可能チェック | DllCanUnloadNow | なし |
サーバ登録 | DllRegisterServer | /regserver |
サーバ登録解除 | DllUnregisterServer | /unregserver |
ユーザ単位サーバ登録 | DllInstall | /regserverperuser |
ユーザ単位サーバ登録解除 | DllInstall | /unregserverperuser |
コマンドラインパラメータは通常'/'から開始しますが、'-'が使われることもあるようです。
また、大文字小文字の区別はありません。
例えば、/embeddingは/Embeddingであってもかまいません。
EXEサーバには、DllCanUnloadNowに相当する機能はありません。
EXEサーバは、COMとして利用されていないことをEXEサーバ自身で検出し、
プロセスを終了させることになります。
EXEサーバとしての起動はコマンドラインにより区別できますので、
単体のプログラムとして実行できるようにしてもかまいません。
また、単体のプログラムとして動作しながら、COMサーバとして動作することも可能です。
DLLサーバ
COMのモデルでは、COMサーバが提供するインターフェースはCOMシステムからは見えますが、
COMクライアントからは見えていません。
COMシステムはCOMサーバ内のオブジェクトとは別のダミーオブジェクトを作成し、
ダミーオブジェクトが備えるインターフェースをCOMクライアントに提供します。
このモデルはCOMサーバの種類によらず利用できますが、
メソッドを呼ぶたびに毎回COMシステムが仲介することになるため、メソッド呼び出しの効率は落ちます。
そこでCOMシステムでは、COMがDLLサーバとして実装されており、
メソッド呼び出しが他のスレッドと競合しない(同一のApartmentへの)呼び出しの場合に限り、
COMサーバのオブジェクトを直接COMクライアントに渡して、メソッドを直接呼びだせるようにしています。
この場合に限り、DLLサーバのcoclassはC++のクラスと同じように扱われます。
EXEサーバ
COMがEXEサーバとして実装されていたり、
メソッド呼び出しが他のスレッドと競合する(異なるApartmentへの呼び出しの)場合には、
COMシステムが仲介するようになります。
COMクライアントのメソッド呼び出しは、
COM proxyによってCOM stubに対するデータ送信に置き換えられます。
COM stubは、データを受信するたびに、
COMサーバ内のcoclassへのメソッドを呼び出します。
このように、EXEサーバはDLLサーバと違い、メソッド呼び出しには必ずCOMシステムが仲介します。
また、EXEサーバはCOMクライアントとは別のプロセスとして起動され、
共有メモリなどを除けば、相手のメモリを参照することはできません。
関連ページ
COM/ActiveXの解説ページ 目次
次の項目: メソッド呼び出し