EXEサーバ - DLLとEXEの違い

いちごパック > COM/ActiveXの解説 > EXEサーバ - DLLとEXEの違い

コマンドライン

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の解説ページ 目次
  • 次の項目: メソッド呼び出し