Использование моникера сеанса
Активация между сеансами позволяет клиентскому процессу активировать локальный серверный процесс в указанном сеансе. Это можно сделать для каждого сеанса, используя предоставленный системой моникер сеанса. Дополнительные сведения о создании моникера сеанса см. в разделе Активация сеанса в сеанс с помощью моникера сеанса.
В следующем примере показано, как активировать локальный серверный процесс с идентификатором класса "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 для платформы.