IRunningObjectTable::Register メソッド (objidl.h)

実行中のオブジェクト テーブル (ROT) にオブジェクトとその識別モニカーを登録します。

構文

HRESULT Register(
  [in]  DWORD    grfFlags,
  [in]  IUnknown *punkObject,
  [in]  IMoniker *pmkObjectName,
  [out] DWORD    *pdwRegister
);

パラメーター

[in] grfFlags

punkObject への ROT の参照が弱いか強いかを指定し、ROT のエントリを通じてオブジェクトへのアクセスを制御します。 詳細については、「解説」を参照してください。

意味
ROTFLAGS_REGISTRATIONKEEPSALIVE
を設定すると、オブジェクトの厳密な登録が示されます。
ROTFLAGS_ALLOWANYCLIENT
設定すると、すべてのクライアントは ROT のエントリを介して実行中のオブジェクトに接続できます。 設定しない場合、オブジェクトを登録したウィンドウ ステーション内のクライアントのみが接続できます。

[in] punkObject

実行中として登録されているオブジェクトへのポインター。

[in] pmkObjectName

punkObject を識別するモニカーへのポインター。

[out] pdwRegister

IRunningObjectTable::Revoke または IRunningObjectTable::NoteChangeTime の後続の呼び出しで使用できる、この ROT エントリの識別子。 呼び出し元は、このパラメーターに NULL を 指定できません。 エラーが発生した場合、*pdwRegister は 0 に設定されます。

戻り値

このメソッドは、E_INVALIDARGおよびE_OUTOFMEMORY標準の戻り値と、次の値を返すことができます。

リターン コード 説明
S_OK
メソッドは正常に完了しました。
MK_S_MONIKERALREADYREGISTERED
モニカーとオブジェクトのペアは正常に登録されましたが、別のオブジェクト (同じオブジェクトである可能性があります) が既に同じモニカーに登録されています。

注釈

このメソッドは、オブジェクトを識別するモニカーの下にオブジェクトへのポインターを登録します。 モニカーは、 テーブルが IRunningObjectTable::GetObject で検索されるときにキーとして使用されます。

オブジェクトが登録されると、ROT は常に オブジェクトに対して AddRef を呼び出します。 弱い登録 (ROTFLAGS_REGISTRATIONKEEPSALIVE設定されていない) の場合、オブジェクトへの最後の厳密な参照が解放されるたびに、ROT によってオブジェクトが解放されます。 厳密な登録 (ROTFLAGS_REGISTRATIONKEEPSALIVE設定) の場合、ROT は、オブジェクトの登録が明示的に取り消されるまでオブジェクトが破棄されないようにします。

LocalService または RunAs として登録されているサーバーは、 Register の呼び出しで ROTFLAGS_ALLOWANYCLIENT フラグを設定して、クライアントがそれに接続できるようにします。 このビットを設定するサーバーの実行可能ファイル名は、実行可能ファイルの AppID を参照するレジストリの AppID セクションに含まれている必要があります。 "activate as activator" サーバー (LocalService または RunAs として登録されていません) は、 Register の呼び出しでこのフラグを設定しないでください。 サービスのインストールの詳細については、「 サービス アプリケーションとしてインストールする」を参照してください。

2 番目のオブジェクトを同じモニカーに登録するか、同じオブジェクトを同じモニカーに再登録すると、ROT に 2 番目のエントリが作成されます。 この場合、 Register はMK_S_MONIKERALREADYREGISTEREDを返します。 重複するエントリでも pdwRegister 識別子が異なるため、Register の各呼び出しは IRunningObjectTable::Revoke の呼び出しと一致する必要があります。 登録の重複に関する問題は、 後続の IRunningObjectTable::IsRunning の呼び出しでモニカーが指定された場合に返されるオブジェクトを決定する方法がないということです。

呼び出し元へのメモ

モニカー プロバイダー (つまり、他のユーザーがアクセスできるようにオブジェクトを識別するモニカーを配布する) 場合は、 Register メソッドを呼び出して、オブジェクトの実行時に登録する必要があります。 オブジェクトの読み込み中にオブジェクトの名前を変更する場合は、このメソッドも呼び出す必要があります。

モニカー プロバイダーの最も一般的な種類は、複合ドキュメント リンク ソースです。 これには、ドキュメントへのリンクをサポートするサーバー アプリケーション (またはドキュメントの一部) と、ドキュメント内の埋め込みへのリンクをサポートするコンテナー アプリケーションが含まれます。 リンクをサポートしていないサーバー アプリケーションでは、ROT を使用して、埋め込みへのリンクをサポートするコンテナー アプリケーションと連携することもできます。

サーバー アプリケーションを作成する場合は、実行中にオブジェクトを ROT に登録する必要があります(通常は IOleObject::D oVerb の実装)。 オブジェクトは完全なモニカーの下に登録する必要があります。そのためには、 IOleClientSite::GetMoniker を使用してコンテナー ドキュメントのモニカーを取得する必要があります。 また、コンテナー ドキュメントの名前が変更された場合に呼び出される IOleObject::SetMoniker の実装でオブジェクトを取り消して再登録する必要もあります。

埋め込みへのリンクをサポートするコンテナー アプリケーションを作成する場合は、読み込まれるときにドキュメントを ROT に登録する必要があります。 ドキュメントの名前が変更された場合は、それを取り消して ROT に再登録し、ドキュメント内の埋め込みオブジェクトに対して IOleObject::SetMoniker を呼び出して、自分で再登録する機会を与える必要があります。

ROT に登録されているオブジェクトは、オブジェクトが実行されなくなった場合、またはそのモニカーが変更されたときに明示的に取り消す必要があります。 システムが ROT からエントリを自動的に削除する方法がないため、この失効は重要です。 pdwRegister を介して書き込まれた識別子をキャッシュし、 IRunningObjectTable::Revoke の呼び出しで使用して登録を取り消す必要があります。 厳密な登録の場合、オブジェクトの登録が取り消されると、厳密な参照が解放されます。

Windows Server 2003 の時点で、サーバーの予期しない問題が原因で ROT に残っている古いエントリがある場合、COM はこれらの古いエントリを ROT から自動的に削除します。

Register のシステムの実装では、pmkObjectName パラメーターで IMoniker::Reduce が呼び出され、登録前にモニカーが完全に削減されます。 オブジェクトが複数の完全に縮小されたモニカーによって認識されている場合は、そのようなモニカーの下に登録する必要があります。

要件

要件
サポートされている最小のクライアント Windows 2000 Professional [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows 2000 Server [デスクトップ アプリのみ]
対象プラットフォーム Windows
ヘッダー objidl.h

こちらもご覧ください

IRunningObjectTable