Bagikan melalui


Menggunakan API Konteks Aktivasi

Aplikasi dapat mengelola konteks aktivasi dengan langsung memanggil fungsi konteks aktivasi. Konteks aktivasi adalah struktur data dalam memori. Sistem dapat menggunakan informasi dalam konteks aktivasi untuk mengalihkan aplikasi untuk memuat versi DLL tertentu, instans objek COM, atau versi jendela kustom. Untuk informasi selengkapnya, lihat Referensi Konteks Aktivasi.

Antarmuka pemrograman aplikasi (API) dapat digunakan untuk mengelola konteks aktivasi dan membuat objek bernama versi dengan manifes. Dua skenario berikut menggambarkan bagaimana aplikasi dapat mengelola konteks aktivasi dengan langsung memanggil fungsi konteks aktivasi. Namun, dalam kebanyakan kasus, konteks aktivasi dikelola oleh sistem. Pengembang aplikasi dan penyedia perakitan biasanya tidak perlu melakukan panggilan ke tumpukan untuk mengelola konteks aktivasi.

  • Proses dan aplikasi yang menerapkan lapisan tidak langsung atau pengiriman.

    Misalnya, pengguna yang mengelola konteks aktivasi dalam perulangan peristiwa. Setiap kali jendela diakses, seperti dengan menggerakkan mouse di atas jendela, ActivateActCtx dipanggil, yang mengaktifkan konteks aktivasi saat ini untuk sumber daya, seperti yang ditunjukkan dalam fragmen kode berikut.

HANDLE hActCtx;  
CreateWindow();  
...  
GetCurrentActCtx(&ActCtx);  
...  
ReleaseActCtx(&ActCtx);  

Dalam fragmen kode berikut, fungsi API mengaktifkan konteks aktivasi yang sesuai sebelum memanggil CallWindowProc. Ketika CallWindowProc dipanggil, callWindowProc menggunakan konteks ini untuk meneruskan pesan ke Windows. Ketika semua operasi sumber daya telah selesai, fungsi akan menonaktifkan konteks.

ULONG_PTR ulpCookie;  
HANDLE hActCtx;  
if(ActivateActCtx(hActCtx, &ulpCookie))  
{  
    ...  
    CallWindowProc(...);  
    ...  
    DeactivateActCtx(0, ulpCookie);  
}
  • Lapisan pengiriman delegator.

    Skenario ini berlaku untuk manajer yang mengelola beberapa entitas dengan lapisan API umum, seperti manajer driver. Meskipun belum diimplementasikan, contohnya adalah driver ODBC.

    Dalam skenario ini, lapisan tengah menjadi mampu memproses pengikatan perakitan. Untuk mendapatkan driver pengikatan khusus versi, penerbit harus memberikan manifes dan menentukan dependensi pada komponen tertentu dalam manifes tersebut. Aplikasi dasar tidak mengikat komponen secara dinamis; pada durasi, manajer driver mengelola panggilan. Ketika driver ODBC dipanggil berdasarkan string sambungkan, ia memuat driver yang sesuai. Kemudian membuat konteks aktivasi menggunakan informasi dalam file manifes perakitan.

    Tanpa manifes, tindakan default untuk driver adalah menggunakan konteks yang sama seperti yang ditentukan oleh aplikasi—dalam contoh ini, versi 2 MSVCRT. Karena manifes memang ada, konteks aktivasi terpisah ditetapkan. Ketika driver ODBC berjalan, ia mengikat ke versi 1 dari rakitan MSVCRT.

    Setiap kali manajer driver memanggil lapisan pengiriman—misalnya, untuk mendapatkan kumpulan data berikutnya—manajer driver menggunakan rakitan yang sesuai berdasarkan konteks aktivasi. Fragmen kode berikut mengilustrasikan hal ini.

HANDLE hActCtx;  
ULONG_PTR ulpCookie;  
ACTCTX ActCtxToCreate = {...};  
hActCtx = CreateActCtx(&ActCtxToCreate);  
...;  
if (ActivateActCtx(hActCtx, &ulpCookie))  
{  
    ...  
    ConnectDb(...);  
    DeactivateActCtx(0, ulpCookie);  
}  
... 
ReleaseActCtx(hActCtx);