Bagikan melalui


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. AfxOleInitModuleCDynLinkLibrary 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. AfxNetInitModuleCDynLinkLibrary 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 :

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>

Baca juga

Makro dan global
AfxMessageBox
Mengelola data status modul MFC