Bagikan melalui


Menggunakan Moniker Sesi

Aktivasi sesi ke sesi memungkinkan proses klien mengaktifkan proses server lokal pada sesi tertentu. Anda dapat melakukan ini per sesi dengan menggunakan moniker sesi yang disediakan sistem. Untuk informasi selengkapnya tentang membuat moniker sesi, lihat Aktivasi Sesi-ke-Sesi dengan Moniker Sesi.

Contoh berikut menunjukkan cara mengaktifkan proses server lokal dengan ID kelas "10000013-0000-0000-0000-0000000000001" pada sesi dengan ID sesi 3.

Pertama, sampel memanggil fungsi CoInitialize untuk menginisialisasi pustaka COM. Kemudian sampel memanggil CreateBindCtx untuk mengambil pointer ke implementasi antarmuka IBindCtx . Objek ini menyimpan informasi tentang operasi pengikatan moniker; pointer diperlukan untuk memanggil metode antarmuka IMoniker . Selanjutnya sampel memanggil fungsi MkParseDisplayNameEx untuk membuat moniker sesi komposit dan kemudian metode IMoniker::BindToObject untuk mengaktifkan koneksi antara klien dan proses server, menggunakan moniker sesi yang baru dibuat. Pada titik ini Anda dapat menggunakan penunjuk antarmuka untuk melakukan operasi yang diinginkan pada objek. Terakhir, sampel merilis konteks ikatan dan memanggil fungsi 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.

Karena "{class id of the class moniker}" juga merupakan cara untuk memberi nama moniker kelas, Anda dapat menggunakan string berikut untuk memberi nama moniker komposit (moniker sesi yang terdiri dengan moniker kelas) alih-alih cara menunjukkan dalam contoh sebelumnya.

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

Catatan

Jika pengguna yang sama masuk ke setiap sesi selama aktivasi lintas sesi, Anda dapat berhasil mengaktifkan proses server apa pun yang dikonfigurasi untuk berjalan dalam mode aktivasi Pengguna Interaktif RunAs. Jika pengguna yang berbeda masuk ke setiap sesi, server harus memanggil fungsi CoInitializeSecurity untuk mengatur hak pengguna yang sesuai sebelum aktivasi dan koneksi berhasil dapat terjadi antara klien dan server. Salah satu cara untuk mencapainya adalah dengan server untuk mengimplementasikan antarmuka IAccessControl kustom dan meneruskan implementasi ke CoInitializeSecurity. Bagaimanapun, pengguna klien harus memiliki Izin Peluncuran dan Akses yang sesuai yang ditentukan oleh aplikasi yang berjalan di server. Untuk informasi selengkapnya, lihat Keamanan di COM.

 

Untuk informasi selengkapnya tentang moniker dan moniker dan mode aktivasi yang disediakan sistem, lihat Monikers, antarmuka IMoniker , dan Kunci AppId dalam dokumentasi COM dalam Kit Pengembangan Perangkat Lunak Platform (SDK).