Bagikan melalui


DLL MFC Reguler Ditautkan Secara Dinamis ke MFC

DLL MFC reguler yang ditautkan secara dinamis ke MFC adalah DLL yang menggunakan MFC secara internal, dan fungsi yang diekspor di DLL dapat dipanggil oleh MFC atau executable non-MFC. Seperti namanya, DLL semacam ini dibangun menggunakan versi pustaka tautan dinamis MFC (juga dikenal sebagai versi bersama MFC). Fungsi biasanya diekspor dari DLL MFC reguler menggunakan antarmuka C standar.

Anda harus menambahkan AFX_MANAGE_STATE makro di awal semua fungsi yang diekspor di DLL MFC reguler yang secara dinamis ditautkan ke MFC untuk mengatur status modul saat ini ke yang untuk DLL. Ini dilakukan dengan menambahkan baris kode berikut ke awal fungsi yang diekspor dari DLL:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

DLL MFC reguler, yang ditautkan secara dinamis ke MFC memiliki fitur-fitur berikut:

  • Ini adalah jenis DLL baru yang diperkenalkan oleh Visual C++ 4.0.

  • Klien yang dapat dieksekusi dapat ditulis dalam bahasa apa pun yang mendukung penggunaan DLL (C, C++, Pascal, Visual Basic, dan sebagainya); tidak harus menjadi aplikasi MFC.

  • Tidak seperti DLL MFC reguler yang ditautkan secara statis, jenis DLL ini secara dinamis ditautkan ke DLL MFC (juga dikenal sebagai DLL MFC bersama).

  • Pustaka impor MFC yang ditautkan ke jenis DLL ini sama dengan yang digunakan untuk DLL atau aplikasi ekstensi MFC menggunakan DLL MFC: MFCxx(D).lib.

DLL MFC reguler, yang ditautkan secara dinamis ke MFC memiliki persyaratan berikut:

  • DLL ini dikompilasi dengan _AFXDLL ditentukan, sama seperti executable yang secara dinamis ditautkan ke DLL MFC. Tetapi _USRDLL juga didefinisikan, sama seperti DLL MFC biasa yang secara statis ditautkan ke MFC.

  • Jenis DLL ini harus membuat CWinAppinstans kelas -turunan.

  • Jenis DLL ini menggunakan yang DllMain disediakan oleh MFC. Tempatkan semua kode inisialisasi khusus DLL dalam InitInstance fungsi anggota dan kode penghentian seperti dalam ExitInstance aplikasi MFC normal.

Karena DLL semacam ini menggunakan MFC versi pustaka tautan dinamis, Anda harus secara eksplisit mengatur status modul saat ini ke yang untuk DLL. Untuk melakukan ini, gunakan makro AFX_MANAGE_STATE di awal setiap fungsi yang diekspor dari DLL.

DLL MFC reguler harus memiliki CWinAppkelas -turunan dan satu objek dari kelas aplikasi tersebut, seperti halnya aplikasi MFC. Namun, CWinApp objek DLL tidak memiliki pompa pesan utama, seperti halnya CWinApp objek aplikasi.

Perhatikan bahwa CWinApp::Run mekanisme tidak berlaku untuk DLL, karena aplikasi memiliki pompa pesan utama. Jika DLL Anda memunculkan dialog tanpa mode atau memiliki jendela bingkai utama sendiri, pompa pesan utama aplikasi Anda harus memanggil rutinitas yang diekspor DLL yang memanggil CWinApp::PreTranslateMessage.

Tempatkan semua inisialisasi khusus DLL dalam CWinApp::InitInstance fungsi anggota seperti dalam aplikasi MFC normal. Fungsi CWinApp::ExitInstance anggota kelas turunan Anda CWinApp dipanggil dari fungsi yang disediakan DllMain MFC sebelum DLL dibongkar.

Anda harus mendistribusikan DLL bersama MFCx0.dll dan Msvcr*0.dll (atau file serupa) dengan aplikasi Anda.

DLL yang ditautkan secara dinamis ke MFC juga tidak dapat ditautkan secara statis ke MFC. Aplikasi menautkan ke DLL MFC reguler yang ditautkan secara dinamis ke MFC, sama seperti DLL lainnya.

Simbol biasanya diekspor dari DLL MFC biasa menggunakan antarmuka C standar. Deklarasi fungsi yang diekspor dari DLL MFC biasa terlihat seperti ini:

extern "C" __declspec(dllexport) MyExportedFunction( );

Semua alokasi memori dalam DLL MFC reguler harus tetap berada dalam DLL; DLL tidak boleh meneruskan atau menerima dari panggilan yang dapat dieksekusi salah satu hal berikut:

  • penunjuk ke objek MFC

  • pointer ke memori yang dialokasikan oleh MFC

Jika Anda perlu melakukan salah satu hal di atas, atau jika Anda perlu meneruskan objek turunan MFC antara panggilan yang dapat dieksekusi dan DLL, maka Anda harus membangun DLL ekstensi MFC.

Aman untuk meneruskan pointer ke memori yang dialokasikan oleh pustaka run-time C antara aplikasi dan DLL hanya jika Anda membuat salinan data. Anda tidak boleh menghapus atau mengubah ukuran pointer ini atau menggunakannya tanpa membuat salinan memori.

Saat membangun DLL MFC reguler yang secara dinamis terhubung ke MFC, Anda perlu menggunakan makro AFX_MANAGE_STATE untuk mengalihkan status modul MFC dengan benar. Ini dilakukan dengan menambahkan baris kode berikut ke awal fungsi yang diekspor dari DLL:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

Makro AFX_MANAGE_STATE tidak boleh digunakan dalam DLL MFC reguler yang secara statis ditautkan ke MFC atau di DLL ekstensi MFC. Untuk informasi selengkapnya, lihat Mengelola Data Status Modul MFC.

Untuk contoh cara menulis, membangun, dan menggunakan DLL MFC reguler, lihat sampel DLLScreenCap. Untuk informasi selengkapnya tentang DLL MFC reguler yang secara dinamis ditautkan ke MFC, lihat bagian berjudul "Mengonversi DLLScreenCap ke Dynamically Link dengan DLL MFC" dalam abstrak untuk sampel.

Apa yang ingin Anda lakukan?

Apa yang ingin Anda ketahui lebih lanjut?

Baca juga

Jenis DLL