アクティブ化時のパーティション検索
コンポーネントをアクティブ化する正しいパーティションを見つけられるかどうかは、以下の要素によって決まります。
- コンポーネントをアクティブ化するために呼び出し元プログラムで使用される関数呼び出しとパラメーター
- アクティブ化されるコンポーネントがローカルかリモートか
- パーティション キャッシュの内部使用
呼び出し元プログラム
COM+ は、呼び出し元プログラムがコンポーネントをアクティブ化する方法に基づいて、コンポーネントのアクティブ化のパーティションを選択します。
コンポーネントのアクティブ化対象としてパーティションを選択するとき、COM+ が実行できるアクションは 3 つあります。 実行されるアクションは、呼び出し元プログラムがオブジェクトをインスタンス化する方法、つまり関数呼び出しにパーティション ID と CLSID のみで構成されるパーティション モニカーが含まれているか、CLSID のみが含まれているかによって異なります。
次の表は、COM+ がパーティションを見つけるために実行できる各種アクションを優先順位の順に示しています。
関数呼び出し | パラメーター | COM+ アクション |
---|---|---|
CoGetObject または GetObject |
パーティション モニカー (パーティション ID と CLSID を含む) |
パーティション モニカーで指定されたパーティション ID を使用します。 |
Cocreateinstance |
CLSID |
ユーザー ID の既定のパーティションのパーティション ID、または同じプロセスにおける以前のコンポーネントのアクティブ化中にコンテキストに追加されたパーティション ID を使用します。 |
前の表に示された COM+ アクションについては、次のセクションで説明します。
パーティション モニカーの使用
パーティションは、パーティション モニカーを使用して、関数呼び出し内で明示的に選択することができます。 パーティション モニカーは、アクティブ化されたコンポーネントのパーティションを明示的に指定するためにコード内で使用されます。 パーティション モニカーを使用してパーティションを見つけた場合、そのパーティションからアクティブ化が実行されます。 つまり、モニカーに含まれるパーティション ID は、ユーザーの既定のパーティションまたは呼び出し元のコンテキストに存在するパーティション ID よりも優先されます。
C++ コードでは、パーティション モニカーを使用するための構文は以下のとおりです。
HRESULT CoGetObject(
L"partition:partitionGUID/new:clsid",
pBindOptions,
IID_IUnknown,
(void**)&pIUnknown);
次の例は、パーティション モニカーが CoGetObject 関数の引数として使用されている C++ コードのスニペットを示しています。
// Create CLSID1 configured in the Production partition.
HRESULT hr = CoGetObject(
L"partition:{35056070-D5B7-4b59-9FBF-0D23417F6937}/new:CLSID1",
pBindOptions, IID_IUnknown, (void**)&pIUnknown);
Visual Basic コードでは、パーティション モニカーの構文は以下のとおりです。
GetObject("partition:partitionGUID/new:CLSID") As Object
次の例は、パーティション モニカーが GetObject 関数の引数として使用されている Visual Basic コードのスニペットを示しています。
Dim objCLSID1 As Object
Set objCLSID1 = GetObject( _
"partition:{35056070-D5B7-4b59-9FBF-0D23417F6937}/new:CLSID1")
既定のマッピングの使用
コンポーネントをアクティブ化するため、コンポーネントの CLSID を使用して CoCreateInstance 関数を使用する場合、COM+ は、ユーザーが Active Directory 内でマッピングされるパーティション セットである既定のユーザー ID マッピングを使用します。 ただし、ユーザーが Active Directory 内のパーティション セットにマッピングされていない場合、グローバル パーティションが選択されます。
パーティション ID とオブジェクト コンテキストの使用
新しいパーティションに割り当てられる 5 つのプロパティの 1 つはパーティション ID です。 クライアント プログラムが CoCreateInstance 関数を呼び出してオブジェクトをインスタンス化すると、パーティション ID がコンテキストに追加されます。 コンテキストからパーティション ID を使用してパーティションを見つけることは重要です。これは、アクティブ化のチェーンが開始した後、パーティション ID がパーティション モニカーによって明示的に変更されない限り同じままであることが保証されるためです。
アクティブ化時のパーティションの特定について詳しくは、「COM+ のキューに登録されたコンポーネントとパーティション」をご覧ください。
ローカルおよびリモートのアクティブ化
- 呼び出されるコンポーネントが別のコンピューターに存在する場合、パーティションのプロパティ (パーティション ID を含む) は他のコンピューターにマーシャリングされ、コンポーネントはマーシャリングされたパーティションからアクティブ化されます。 パーティション ID がマーシャリングされなかった場合、COM+ は Active Directory 内のユーザー ID にマップされた既定のパーティション セットを使用します。
パーティション キャッシュ
ドメイン環境では、COM+ は、Active Directory でのマッピングを使用して、コンポーネントのアクティブ化に適したパーティションを見つけます。 ただし、Active Directory で頻繁に参照すると、ネットワーク トラフィックが過剰になることがあります。 Active Directory におけるユーザーからパーティション セットへのマッピングの頻繁な参照に起因するネットワーク トラフィックを最小限に抑えるため、COM+ はパーティション キャッシュを使用します。
パーティション キャッシュには、Active Directory においてユーザー ID または OU とそのパーティション セット間で行われたマッピングが含まれています。 このパーティション キャッシュは、COM+ アプリケーションが存在するアプリケーション サーバーにあります。
COM+ は、ユーザーの既定のパーティションを決定したり、パーティションに対するユーザーのアクセス権を検証したりする必要があるとき、Active Directory をリモートでチェックする代わりに、パーティション キャッシュをローカルでチェックしてユーザーのマッピングを参照します。
パーティション キャッシュ内の参照に失敗した場合、COM+ は Active Directory をチェックします。 Active Directory で参照に成功した場合、COM+ はそのマッピングをパーティション キャッシュに格納します。 そのユーザーからパーティションへのマッピングに対して次回参照が行われると、COM+ はパーティション キャッシュで検索します。
次の図は、COM+ がコンポーネントのアクティブ化のためにパーティションを見つけるために使用するプロセスを示しています。
キャッシュのサイズとキャッシュ エントリの有効期限は、レジストリ キーを通じて設定されます。 これらのレジストリ キーの構成については、「COM+ パーティションの作成と構成」をご覧ください。
Note
サーバー コンピューターがネットワークから切断され、サーバーの切断時にユーザーからパーティションへのマッピングが変更された場合、パーティション キャッシュに古いユーザーからパーティションへのマッピングが含まれている可能性があります。 ユーザーからパーティションへのマッピングがコンポーネントのアクティブ化に使用されるメカニズムである場合、アクティブ化エラーが発生する可能性があります。