Использование моникера сеанса

Активация между сеансами позволяет клиентскому процессу активировать локальный серверный процесс в указанном сеансе. Это можно сделать для каждого сеанса, используя предоставленный системой моникер сеанса. Дополнительные сведения о создании моникера сеанса см. в разделе Активация сеанса в сеанс с помощью моникера сеанса.

В следующем примере показано, как активировать локальный серверный процесс с идентификатором класса "10000013-0000-0000-00000000001" в сеансе с идентификатором 3.

Сначала в примере вызывается функция 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";

Примечание

Если один и тот же пользователь входит в каждый сеанс во время активации между сеансами, можно успешно активировать любой серверный процесс, настроенный для запуска в режиме интерактивной активации пользователя запуска от имени. Если в каждый сеанс входят разные пользователи, сервер должен вызвать функцию CoInitializeSecurity , чтобы задать соответствующие права пользователя перед успешной активацией и подключением между клиентом и сервером. Один из способов сделать это — реализовать пользовательский интерфейс IAccessControl на сервере и передать реализацию в CoInitializeSecurity. В любом случае пользователь клиента должен иметь соответствующие разрешения назапуск и доступ, указанные приложением, работающим на сервере. Дополнительные сведения см. в разделе Безопасность в COM.

 

Дополнительные сведения о предоставляемых системой моникерах и моникерах и режимах активации см. в разделе Моникеры, интерфейс IMoniker и ключ AppId в документации COM в пакете sdk для платформы.