Поделиться через


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

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