サーバ処理の流れ
/Embeddingで起動されたときのEXEサーバの流れは次のようになります。
なお、以下の説明はSingle Thread Apartment(STA)を利用する場合の流れになります。
コマンドラインを解析し、/Embeddingで起動されたことを検出する。
COMシステムを初期化する。
EXEサーバが提供するclass objectを、新規作成待ちを停止した状態でCoRegisterClassObject()によりCOMシステムに登録する。
class objectの新規作成待ちを開始する。
メッセージループ処理を行う。
class objectやcoclassが参照されなくなった時点で、class objectの新規作成待ちを停止し、メッセージループを打ち切る。
class objectの登録をCoRevokeClassObject()により解除する。
COMシステムの終了処理を実行し、EXEサーバを終了する。
class objectは複数でもかまいません。
その場合は、CoRegisterClassObject()とCoRevokeClassObject()を必要な回数だけ繰り返します。
新規作成待ちのタイミング
EXEサーバは他のプロセスと同時に動作しています。
CoRegisterClassObject()の実行時点で新規作成待ちを開始し、
CoRevokeClassObject()の実行時点で新規作成待ちを終了すると、
例えばメッセージループを打ち切ってからCoRevokeClassObject()が実行されるまでに、
class objectが新しく作成されてしまうことがあります。
また、複数のCoRegisterClassObject()を実行する場合は、
第1のCoRegisterClassObject()の実行後、
第2のCoRegisterClassObject()の実行前に別のCoCreateInstance()が実行されると、
COMシステムは別のEXEサーバを起動する可能性があります。
これらの問題は、次の簡単な方法で防ぐことができます。
CoRegisterClassObject()は必ず新規作成待ち停止状態で実行する。
すべてのCoRegisterClassObject()を実行した後で、CoResumeClassObjects()を実行して新規作成待ち状態する。
class objectやcoclassが参照されなくなった時点で、CoSuspendClassObjects()により新規作成待ちを停止する。
新規作成待ちが停止された状態で、CoRevokeClassObject()によりすべてのclass objectを登録解除する。
後で説明するCoReleaseServerProcess()を利用する場合には、
CoReleaseServerProcess()がCoSuspendClassObjects()を呼び出します。
その場合、直接CoSuspendClassObjects()を呼び出す必要はありませんが、
このような処理が行われていることは留意しておくと良いでしょう。
関連ページ
COM/ActiveXの解説ページ 目次
前の項目: メソッド呼び出し
次の項目: コマンドラインの解析