セッション モニカーの使用
セッション間のアクティブ化を使用すると、クライアント プロセスは、指定したセッションでローカル サーバー プロセスをアクティブ化できます。 システム提供のセッション モニカーを使用して、セッションごとにこれを行うことができます。 セッション モニカーの作成の詳細については、「セッション モニカーを使用 したセッション間のアクティブ化」を参照してください。
次の例では、セッション ID 3 のセッションでクラス ID "10000013-0000-0000-0000-0000000000001" を使用してローカル サーバー プロセスをアクティブ化する方法を示します。
最初に、このサンプルでは CoInitialize 関数を呼び出して COM ライブラリを初期化します。 次に、 CreateBindCtx を呼び出して、 IBindCtx インターフェイスの実装へのポインターを取得します。 このオブジェクトには、モニカー バインド操作に関する情報が格納されます。ポインターは、 IMoniker インターフェイスのメソッドを呼び出すために必要です。 次に、サンプルは MkParseDisplayNameEx 関数を呼び出して複合セッション モニカーを作成し、 次に IMoniker::BindToObject メソッドを呼び出して、新しく作成されたセッション モニカーを使用してクライアントとサーバー プロセス間の接続をアクティブにします。 この時点で、インターフェイス ポインターを使用して、オブジェクトに対して目的の操作を実行できます。 最後に、バインド コンテキストを解放し、 CoUninitialize 関数を呼び出します。
// Initialize COM.
HRESULT hr = CoInitialize(NULL);
if (FAILED(hr)) exit(0); // Handle errors here.
// Get interface pBindCtx.
IBindCtx* pBindCtx;
hr = CreateBindCtx(NULL, &pBindCtx);
if (FAILED(hr)) exit(0); // Handle errors here.
// Get moniker pMoniker.
OLECHAR string[] =
L"Session:3!clsid:10000013-0000-0000-0000-000000000001";
ULONG ulParsed;
IMoniker* pMoniker;
hr = MkParseDisplayNameEx( pBindCtx,
string,
&ulParsed,
&pMoniker
);
if (FAILED(hr)) exit(0); // Handle errors here.
// Get object factory pSessionTestFactory.
IUnknown* pSessionTestFactory;
hr = pMoniker->BindToObject( pBindCtx,
NULL,
IID_IUnknown,
(void**)&pSessionTestFactory
);
if (FAILED(hr)) exit(0); // Handle errors here.
//
// Make, use, and destroy object here.
//
pSessionTestFactory->Release();
pSessionTestFactory = NULL;
pMoniker->Release(); // Release moniker.
pBindCtx->Release(); // Release interface.
CoUninitialize(); // Release COM.
"{class id of the class moniker}" はクラス モニカーに名前を付ける方法でもあるため、前の例で示した方法ではなく、次の文字列を使用して複合モニカー (クラス モニカーで構成されるセッション モニカー) に名前を付けることができます。
OLECHAR string[] =
L"Session:3!{0000031A-0000-0000-C000-000000000046}:
10000013-0000-0000-0000-000000000001";
Note
セッション間のアクティブ化中に同じユーザーが各セッションにログオンしている場合は、RunAs 対話型ユーザー アクティブ化モードで実行するように構成されたサーバー プロセスを正常にアクティブ化できます。 セッションごとに異なるユーザーがログオンしている場合、サーバーは CoInitializeSecurity 関数を呼び出して適切なユーザー権限を設定してから、クライアントとサーバーの間で正常なアクティブ化と接続を行う必要があります。 これを実現する 1 つの方法は、サーバーがカスタム IAccessControl インターフェイスを実装し、その実装を CoInitializeSecurity に渡すことです。 いずれの場合も、クライアント ユーザーは、サーバー上で実行されているアプリケーションによって指定された適切な 起動 および アクセス許可 を持っている必要があります。 詳細については、「 COM のセキュリティ」を参照してください。
システム提供のモニカーとモニカーとアクティブ化モードの詳細については、プラットフォーム ソフトウェア開発キット (SDK) の COM ドキュメントの 「モニカー、 IMoniker インターフェイス、 AppId Key 」を参照してください。