Makro dan fungsi untuk mengelola DLL
Nama | Deskripsi |
---|---|
AFX_EXT_CLASS ] |
Mengekspor kelas. |
AFX_MANAGE_STATE |
Lindungi fungsi yang diekspor dalam DLL. |
AfxOleInitModule |
Menyediakan dukungan OLE dari DLL MFC reguler yang secara dinamis ditautkan ke MFC. |
AfxNetInitModule |
Menyediakan dukungan MFC Sockets dari DLL MFC reguler yang secara dinamis ditautkan ke MFC. |
AfxGetAmbientActCtx |
Mendapatkan status bendera status per modul saat ini. |
AfxGetStaticModuleState |
Mengatur status modul sebelum inisialisasi dan memulihkan status modul sebelumnya setelah pembersihan. |
AfxInitExtensionModule |
Menginisialisasi DLL. |
AfxSetAmbientActCtx |
atur bendera status per modul, yang memengaruhi perilaku WinSxS MFC. |
AfxTermExtensionModule |
Memungkinkan MFC membersihkan DLL ekstensi MFC ketika setiap proses terlepas dari DLL. |
AFX_EXT_CLASS
DLL ekstensi MFC menggunakan makro AFX_EXT_CLASS
untuk mengekspor kelas; executable yang ditautkan ke DLL ekstensi MFC menggunakan makro untuk mengimpor kelas.
Keterangan
AFX_EXT_CLASS
Dengan makro, file header yang sama yang digunakan untuk membangun DLL ekstensi MFC dapat digunakan dengan executable yang ditautkan ke DLL.
Di file header untuk DLL Anda, tambahkan AFX_EXT_CLASS
kata kunci ke deklarasi kelas Anda sebagai berikut:
class AFX_EXT_CLASS CMyClass : public CDocument
{
// <body of class>
};
Untuk informasi selengkapnya, lihat Mengekspor dan mengimpor menggunakan AFX_EXT_CLASS
.
Persyaratan
Header:<afxv_dll.h>
AFX_MANAGE_STATE
Panggil makro ini untuk melindungi fungsi yang diekspor dalam DLL.
Sintaks
AFX_MANAGE_STATE(AFX_MODULE_STATE* pModuleState )
Parameter
pModuleState
Penunjuk ke AFX_MODULE_STATE
struktur.
Keterangan
Ketika makro ini dipanggil, pModuleState
adalah status modul yang efektif untuk sisa cakupan langsung yang berisi. Setelah meninggalkan cakupan, status modul efektif sebelumnya akan dipulihkan secara otomatis.
Struktur AFX_MODULE_STATE
berisi data global untuk modul, yaitu bagian dari status modul yang didorong atau dimunculkan.
Secara default, MFC menggunakan handel sumber daya aplikasi utama untuk memuat templat sumber daya. Jika Anda memiliki fungsi yang diekspor dalam DLL, seperti yang meluncurkan kotak dialog di DLL, templat sumber daya disimpan dalam modul DLL. Pastikan untuk mengalihkan status modul agar handel yang benar digunakan. Anda dapat mengalihkan status dengan menambahkan kode berikut ke awal fungsi:
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
Makro ini menukar status modul saat ini dengan status yang dikembalikan dari AfxGetStaticModuleState
hingga akhir cakupan saat ini.
Untuk informasi selengkapnya tentang status modul dan MFC, lihat Mengelola data status modul MFC dan Catatan Teknis 58.
Catatan
Ketika MFC membuat konteks aktivasi untuk perakitan, MFC menggunakan AfxWinInit
untuk membuat konteks dan AFX_MANAGE_STATE
untuk mengaktifkan dan menonaktifkannya. Perhatikan juga bahwa AFX_MANAGE_STATE
diaktifkan untuk pustaka MFC statis, serta DLL MFC, untuk memungkinkan kode MFC dijalankan dalam konteks aktivasi yang tepat yang dipilih oleh DLL Pengguna. Untuk informasi selengkapnya, lihat Dukungan untuk Konteks Aktivasi dalam Status Modul MFC.
Persyaratan
Header:<afxstat_.h>
AfxOleInitModule
Untuk dukungan OLE dari DLL MFC reguler yang secara dinamis ditautkan ke MFC, panggil fungsi ini dalam fungsi DLL MFC CWinApp::InitInstance
reguler Anda untuk menginisialisasi DLL OLE MFC.
Sintaks
void AFXAPI AfxOleInitModule( );
Keterangan
DLL MFC OLE adalah DLL ekstensi MFC; agar DLL ekstensi MFC dapat dikabeli ke dalam CDynLinkLibrary
rantai, ia harus membuat CDynLinkLibrary
objek dalam konteks setiap modul yang akan menggunakannya. AfxOleInitModule
CDynLinkLibrary
membuat objek dalam konteks DLL MFC reguler Anda sehingga terkabel ke dalam CDynLinkLibrary
rantai objek DLL MFC reguler.
Jika Anda membangun kontrol OLE dan menggunakan COleControlModule
, Anda tidak boleh memanggil AfxOleInitModule
karena InitInstance
fungsi anggota untuk COleControlModule
panggilan AfxOleInitModule
.
Persyaratan
Header: <afxdll_.h>
AfxNetInitModule
Untuk dukungan MFC Sockets dari DLL MFC reguler yang secara dinamis ditautkan ke MFC, tambahkan panggilan ke fungsi ini dalam fungsi DLL MFC CWinApp::InitInstance
reguler Anda untuk menginisialisasi DLL Soket MFC.
Sintaks
void AFXAPI AfxNetInitModule( );
Keterangan
DLL Soket MFC adalah DLL ekstensi MFC; agar DLL ekstensi MFC dapat dikabeli ke dalam CDynLinkLibrary
rantai, ia harus membuat CDynLinkLibrary
objek dalam konteks setiap modul yang akan menggunakannya. AfxNetInitModule
CDynLinkLibrary
membuat objek dalam konteks DLL MFC reguler Anda sehingga terkabel ke dalam CDynLinkLibrary
rantai objek DLL MFC reguler.
Persyaratan
Header:<afxdll_.h>
AfxGetAmbientActCtx
Gunakan fungsi ini untuk mendapatkan status bendera status per modul saat ini, yang memengaruhi perilaku WinSxS MFC.
Sintaks
BOOL AFXAPI AfxGetAmbientActCtx();
Tampilkan Nilai
Nilai bendera status modul saat ini.
Keterangan
Ketika bendera diatur (yang merupakan default) dan utas memasuki modul MFC (lihat AFX_MANAGE_STATE
), konteks modul diaktifkan.
Jika bendera tidak diatur, konteks modul tidak diaktifkan pada entri.
Konteks modul ditentukan dari manifesnya, sering disematkan dalam sumber daya modul.
Persyaratan
Header:<afxcomctl32.h>
AfxGetStaticModuleState
Panggil fungsi ini untuk mengatur status modul sebelum inisialisasi dan memulihkan status modul sebelumnya setelah pembersihan.
Sintaks
AFX_MODULE_STATE* AFXAPI AfxGetStaticModuleState( );
Tampilkan Nilai
Penunjuk ke AFX_MODULE_STATE
struktur.
Keterangan
Struktur AFX_MODULE_STATE
berisi data global untuk modul, yaitu bagian dari status modul yang didorong atau dimunculkan.
Secara default, MFC menggunakan handel sumber daya aplikasi utama untuk memuat templat sumber daya. Jika Anda memiliki fungsi yang diekspor dalam DLL, seperti yang meluncurkan kotak dialog di DLL, templat sumber daya disimpan dalam modul DLL. Pastikan untuk mengalihkan status modul agar handel yang benar digunakan. Anda dapat mengalihkan status dengan menambahkan kode berikut ke awal fungsi:
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
Makro ini menukar status modul saat ini dengan status yang dikembalikan dari AfxGetStaticModuleState
hingga akhir cakupan saat ini.
Untuk informasi selengkapnya tentang status modul dan MFC, lihat Mengelola data status modul MFC dan Catatan Teknis 58.
Persyaratan
Header:<afxstat_.h>
AfxInitExtensionModule
Panggil fungsi ini dalam DLL DllMain
ekstensi MFC untuk menginisialisasi DLL.
Sintaks
BOOL AFXAPI AfxInitExtensionModule( AFX_EXTENSION_MODULE& state, HMODULE hModule );
Parameter
state
Referensi ke AFX_EXTENSION_MODULE
struktur Struktur yang akan berisi status modul DLL ekstensi MFC setelah inisialisasi. Status ini mencakup salinan objek kelas runtime yang telah diinisialisasi oleh DLL ekstensi MFC sebagai bagian dari konstruksi objek statis normal yang dijalankan sebelum DllMain
dimasukkan.
hModule
Handel modul DLL ekstensi MFC.
Tampilkan Nilai
TRUE
jika DLL ekstensi MFC berhasil diinisialisasi; jika tidak, FALSE
.
Keterangan
Contohnya:
static AFX_EXTENSION_MODULE NVC_MFC_DLLDLL;
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// Remove this if you use lpReserved
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("NVC_MFC_DLL.DLL Initializing!\n");
// MFC extension DLL one-time initialization
if (!AfxInitExtensionModule(NVC_MFC_DLLDLL, hInstance))
return 0;
...
AfxInitExtensionModule
membuat salinan HMODULE DLL dan mengambil kelas runtime dll (CRuntimeClass
struktur) dan juga pabrik objek (COleObjectFactory
objek) untuk digunakan nanti saat CDynLinkLibrary
objek dibuat.
DLL ekstensi MFC perlu melakukan dua hal dalam fungsinya DllMain
:
Panggil
AfxInitExtensionModule
dan periksa nilai yang dikembalikan.Buat
CDynLinkLibrary
objek jika DLL akan mengeksporCRuntimeClass
objek Struktur atau memiliki sumber daya kustomnya sendiri.
Anda dapat memanggil AfxTermExtensionModule
untuk membersihkan DLL ekstensi MFC ketika setiap proses terlepas dari DLL ekstensi MFC (yang terjadi ketika proses keluar, atau ketika DLL dibongkar oleh AfxFreeLibrary
panggilan).
Persyaratan
Header:<afxdll_.h>
AfxSetAmbientActCtx
Gunakan fungsi ini untuk mengatur bendera status per modul, yang memengaruhi perilaku WinSxS MFC.
Sintaks
void AFXAPI AfxSetAmbientActCtx(BOOL bSet);
Parameter
bSet
Nilai baru bendera status modul.
Keterangan
Ketika bendera diatur (yang merupakan default) dan utas memasuki modul MFC (lihat AFX_MANAGE_STATE
), konteks modul diaktifkan.
Jika bendera tidak diatur, konteks modul tidak diaktifkan pada entri.
Konteks modul ditentukan dari manifesnya, sering disematkan dalam sumber daya modul.
Contoh
BOOL CMFCListViewApp::InitInstance()
{
AfxSetAmbientActCtx(FALSE);
// Remainder of function definition omitted.
}
Persyaratan
Header:<afxcomctl32.h>
AfxTermExtensionModule
Panggil fungsi ini untuk memungkinkan MFC membersihkan DLL ekstensi MFC ketika setiap proses terlepas dari DLL (yang terjadi ketika proses keluar, atau ketika DLL dibongkar oleh AfxFreeLibrary
panggilan).
Sintaks
void AFXAPI AfxTermExtensionModule( AFX_EXTENSION_MODULE& state, BOOL bAll = FALSE );
Parameter
state
Referensi ke AFX_EXTENSION_MODULE
struktur yang berisi status modul DLL ekstensi MFC.
bAll
Jika TRUE, bersihkan semua modul DLL ekstensi MFC. Jika tidak, bersihkan hanya modul DLL saat ini.
Keterangan
AfxTermExtensionModule
akan menghapus penyimpanan lokal apa pun yang dilampirkan ke modul dan menghapus entri apa pun dari cache peta pesan. Contohnya:
static AFX_EXTENSION_MODULE NVC_MFC_DLLDLL;
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// Remove this if you use lpReserved
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("NVC_MFC_DLL.DLL Initializing!\n");
// MFC extension DLL one-time initialization
if (!AfxInitExtensionModule(NVC_MFC_DLLDLL, hInstance))
return 0;
new CMyDynLinkLibrary(NVC_MFC_DLLDLL);
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("NVC_MFC_DLL.DLL Terminating!\n");
// Terminate the library before destructors are called
AfxTermExtensionModule(NVC_MFC_DLLDLL);
}
return 1; // ok
}
Jika aplikasi Anda memuat dan membebaskan DLL ekstensi MFC secara dinamis, pastikan untuk memanggil AfxTermExtensionModule
. Karena sebagian besar DLL ekstensi MFC tidak dimuat secara dinamis (biasanya, MEREKA ditautkan melalui pustaka impor mereka), panggilan ke AfxTermExtensionModule
biasanya tidak diperlukan.
DLL ekstensi MFC perlu memanggil AfxInitExtensionModule
di .DllMain
Jika DLL mengekspor CRuntimeClass
objek atau memiliki sumber daya kustomnya sendiri, Anda juga perlu membuat CDynLinkLibrary
objek di DllMain
.
Persyaratan
Header:<afxdll_.h>
Lihat juga
Makro dan global
AfxMessageBox
Mengelola data status modul MFC