セッション間ライセンス認証を使用すると、クライアント プロセスは、指定されたセッションでローカル サーバー プロセスをアクティブ化できます。 これは、システム提供のセッション モニカーを使用して、セッションごとに行うことができます。 セッション モニカーの作成の詳細については、「セッション モニカーを使用したセッション間アクティブ化」を参照してください。
次の例は、セッション ID 3 のセッションで、クラス ID "100000013-0000-0000-0000-000000000001" を持つローカル サーバー プロセスをアクティブ化する方法を示しています。
最初に、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";
手記
セッション間のアクティブ化中に同じユーザーが各セッションにログオンしている場合は、RunAs Interactive User アクティブ化モードで実行するように構成されたサーバー プロセスを正常にアクティブ化できます。 各セッションに異なるユーザーがログオンしている場合、サーバーは、CoInitializeSecurity 関数を呼び出して適切なユーザー権限を設定してから、クライアントとサーバーの間で正常なライセンス認証と接続を行う必要があります。 これを実現する 1 つの方法は、サーバーがカスタム IAccessControl インターフェイスを実装し、その実装を CoInitializeSecurityに渡すことです。 いずれの場合も、クライアント ユーザーは、サーバー上で実行されているアプリケーションによって指定された適切な 起動 と アクセス許可 を持っている必要があります。 詳細については、「COM のセキュリティ」を参照してください。
システム提供のモニカーやアクティベーションモードの詳細については、プラットフォーム ソフトウェア開発キット (SDK) の COM ドキュメントの「モニカー、IMoniker インターフェース、および AppId Key」を参照してください。