次の方法で共有


セッション モニカーの使用

セッション間のアクティブ化を使用すると、クライアント プロセスは、指定したセッションでローカル サーバー プロセスをアクティブ化できます。 システム提供のセッション モニカーを使用して、セッションごとにこれを行うことができます。 セッション モニカーの作成の詳細については、「セッション モニカーを使用 したセッション間のアクティブ化」を参照してください。

次の例では、セッション 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 」を参照してください。