使用会话名字对象

会话到会话激活允许客户端进程在指定会话上激活本地服务器进程。 可以使用系统提供的会话名字对象按会话执行此操作。 有关创建会话名字对象的详细信息,请参阅 使用会话名字对象激活会话到会话

以下示例演示如何在会话 ID 为 3 的会话上激活类 ID 为“10000013-0000-0000-0000-0000-000000000001”的本地服务器进程。

首先,此示例调用 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.

由于“类名字对象}的{类 id”也是一种命名类名字对象的方法,因此可以使用以下字符串来命名复合名字对象 (会话名字对象由类名字对象) 而不是前面示例中所示的方式。

OLECHAR string[] = 
    L"Session:3!{0000031A-0000-0000-C000-000000000046}:
    10000013-0000-0000-0000-000000000001";

注意

如果在跨会话激活期间同一用户登录到每个会话,则可以成功激活配置为在 RunAs 交互式用户激活模式下运行的任何服务器进程。 如果不同的用户登录到每个会话,则服务器必须调用 CoInitializeSecurity 函数来设置适当的用户权限,然后客户端和服务器之间才能成功激活和连接。 实现此目的的一种方法是让服务器实现自定义 IAccessControl 接口,并将实现传递给 CoInitializeSecurity。 在任何情况下,客户端用户都必须具有由服务器上运行的应用程序指定的相应 启动访问权限 。 有关详细信息,请参阅 COM 中的安全性

 

有关系统提供的名字对象、名字对象和激活模式的详细信息,请参阅平台软件开发工具包 (SDK) COM 文档中的名字 对象IMoniker 接口和 AppId 密钥