Использование моникера сеанса
Активация между сеансами позволяет клиентскому процессу активировать локальный серверный процесс в указанном сеансе. Это можно сделать для каждого сеанса, используя идентификатор сеанса, предоставленный системой. Дополнительные сведения о создании session moniker см. в разделе Активация между сессиями с session moniker.
В следующем примере показано, как активировать локальный процесс сервера с идентификатором класса "10000013-0000-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";
Заметка
Если один и тот же пользователь вошел в каждый сеанс во время межсеансовой активации, вы можете успешно активировать любой серверный процесс, настроенный для запуска в режиме интерактивной активации пользователей RunAs. Если разные пользователи вошли в систему для каждого сеанса, сервер должен вызвать функцию CoInitializeSecurity, чтобы задать соответствующие права пользователя до успешной активации и установления соединения между клиентом и сервером. Одним из способов достижения этого будет реализация пользовательского интерфейса IAccessControl с последующей передачей этой реализации в CoInitializeSecurity. В любом случае пользователь клиента должен иметь соответствующие разрешения на запуск и разрешения на доступ , указанные приложением на сервере. Дополнительные сведения см. в статье "Security in COM".
Дополнительные сведения о моникерах, предоставляемых системой, и режимах активации см. в Моникеры, интерфейсе IMoniker и ключе AppId в документации COM в пакете SDK для разработки программного обеспечения платформы.