Använda en sessionsmoniker
Aktivering från session till session gör att en klientprocess kan aktivera en lokal serverprocess i en angiven session. Du kan göra detta per session med hjälp av en systemangiven sessionsmoniker. Mer information om hur du skapar en sessionsmoniker finns i Session-till-session-aktivering med en sessionsmoniker.
I följande exempel visas hur du aktiverar en lokal serverprocess med klass-ID:t "10000013-0000-0000-0000-0000000001" i sessionen med sessions-ID 3.
Först anropar exemplet funktionen CoInitialize för att initiera COM-biblioteket. Sedan anropar exemplet CreateBindCtx för att hämta en pekare till en implementering av gränssnittet IBindCtx. Det här objektet lagrar information om monikerbindningsåtgärder. pekaren krävs för att anropa metoder för gränssnittet IMoniker. Därefter anropar exemplet funktionen MkParseDisplayNameEx för att skapa den sammansatta sessionsmonikern och sedan IMoniker::BindToObject-metoden för att aktivera anslutningen mellan klienten och serverprocessen med hjälp av den nyligen skapade sessionsmonikern. Nu kan du använda gränssnittspekaren för att utföra önskade åtgärder på objektet. Slutligen släpper exemplet bindningskontexten och anropar funktionen 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.
Eftersom "{klass-ID för klassmoniker}" också är ett sätt att namnge en klassmoniker kan du använda följande sträng för att ge den sammansatta monikern namnet (sessionsmonikern som består av klassmonikern) i stället för sättet som visas i föregående exempel.
OLECHAR string[] =
L"Session:3!{0000031A-0000-0000-C000-000000000046}:
10000013-0000-0000-0000-000000000001";
Obs
Om samma användare är inloggad på varje session under en aktivering mellan sessioner kan du aktivera alla serverprocesser som har konfigurerats för att köras i aktiveringsläget RunAs Interactive User. Om olika användare är inloggade på varje session måste servern anropa funktionen CoInitializeSecurity för att ange lämpliga användarrättigheter innan en lyckad aktivering och anslutning kan ske mellan klienten och servern. Ett sätt att göra detta är att servern implementerar ett anpassat IAccessControl--gränssnitt och skickar implementeringen till CoInitializeSecurity. I vilket fall som helst måste klientanvändaren ha rätt Starta och åtkomstbehörigheter som anges av programmet som körs på servern. Mer information finns i Security i COM.
Mer information om systemtillhandahållna monikers och aktiveringslägen finns i Monikers, gränssnittet IMoniker och AppId Key i COM-dokumentationen i Platform Software Development Kit (SDK).