Edit

Bagikan melalui


Tanya jawab umum DLL

Bisakah DLL MFC membuat beberapa utas?

Kecuali selama inisialisasi, DLL MFC dapat membuat beberapa utas dengan aman selama menggunakan fungsi penyimpanan lokal utas Win32 (TLS) seperti TlsAlloc untuk mengalokasikan penyimpanan lokal utas. Namun, jika DLL MFC menggunakan untuk mengalokasikan penyimpanan lokal utas, aplikasi klien harus secara implisit __declspec(thread) ditautkan ke DLL. Jika aplikasi klien secara eksplisit menautkan ke DLL, panggilan ke LoadLibrary tidak akan berhasil memuat DLL. Untuk informasi selengkapnya tentang variabel thread-local di DLL, lihat utas.

DLL MFC yang membuat utas MFC baru selama startup akan berhenti merespons saat dimuat oleh aplikasi. Ini termasuk setiap kali utas dibuat dengan memanggil AfxBeginThread atau CWinThread::CreateThread di dalam:

  • Dari InitInstance CWinAppobjek -turunan dalam DLL MFC reguler.

  • Fungsi yang disediakan DllMain atau RawDllMain dalam DLL MFC reguler.

  • Fungsi yang disediakan DllMain atau RawDllMain dalam DLL ekstensi MFC.

Dapatkah aplikasi multithread mengakses DLL MFC di utas yang berbeda?

Aplikasi multithreaded dapat mengakses DLL MFC reguler yang secara dinamis ditautkan ke DLL ekstensi MFC dan MFC dari utas yang berbeda. Aplikasi dapat mengakses DLL MFC reguler yang secara statis ditautkan ke MFC dari beberapa utas yang dibuat dalam aplikasi.

Apakah ada kelas atau fungsi MFC yang tidak dapat digunakan dalam DLL MFC?

DLL ekstensi menggunakan CWinAppkelas -turunan dari aplikasi klien. Mereka tidak boleh memiliki kelas turunan sendiri CWinApp.

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

Perhatikan bahwa karena CWinApp::Run mekanisme tidak berlaku untuk DLL, aplikasi memiliki pompa pesan utama. Jika DLL membuka kotak dialog modeless atau memiliki jendela bingkai utama sendiri, pompa pesan utama aplikasi harus memanggil rutinitas yang diekspor oleh DLL, yang pada gilirannya memanggil CWinApp::PreTranslateMessage fungsi anggota objek aplikasi DLL.

Teknik pengoptimalan apa yang harus saya gunakan untuk meningkatkan performa aplikasi klien saat memuat?

Jika DLL Anda adalah DLL MFC reguler yang secara statis ditautkan ke MFC, mengubahnya ke DLL MFC reguler yang secara dinamis ditautkan ke MFC mengurangi ukuran file.

Jika DLL memiliki sejumlah besar fungsi yang diekspor, gunakan file .def untuk mengekspor fungsi (alih-alih menggunakan __declspec(dllexport)) dan menggunakan atribut NONAME file .def pada setiap fungsi yang diekspor. Atribut NONAME hanya menyebabkan nilai ordinal dan bukan nama fungsi yang akan disimpan dalam tabel ekspor DLL, yang mengurangi ukuran file.

DLL yang secara implisit ditautkan ke aplikasi dimuat saat aplikasi dimuat. Untuk meningkatkan performa saat memuat, coba pisahkan DLL ke DALAM DLL yang berbeda. Letakkan semua fungsi yang dibutuhkan aplikasi panggilan segera setelah memuat ke dalam satu DLL dan memiliki aplikasi panggilan yang secara implisit ditautkan ke DLL tersebut. Letakkan fungsi lain yang tidak dibutuhkan aplikasi panggilan langsung ke DLL lain dan minta aplikasi secara eksplisit menautkan ke DLL tersebut. Untuk informasi selengkapnya, lihat Menautkan yang dapat dieksekusi ke DLL.

Ada kebocoran memori di DLL MFC reguler saya, tetapi kode saya terlihat baik-baik saja. Bagaimana aku bisa menemukan kebocoran memori?

Salah satu kemungkinan penyebab kebocoran memori adalah bahwa MFC membuat objek sementara yang digunakan di dalam fungsi handler pesan. Dalam aplikasi MFC, objek sementara ini secara otomatis dibersihkan dalam CWinApp::OnIdle() fungsi yang dipanggil di antara pesan pemrosesan. Namun, di pustaka tautan dinamis (DLL) MFC, OnIdle() fungsi tidak dipanggil secara otomatis. Akibatnya, objek sementara tidak dibersihkan secara otomatis. Untuk membersihkan objek sementara, DLL harus secara eksplisit memanggil OnIdle(1) secara berkala.