Membuat C/C++ DLL di Visual Studio
Di Windows, pustaka tautan dinamis (DLL) adalah semacam file yang dapat dieksekusi yang bertindak sebagai pustaka fungsi dan sumber daya bersama. Penautan dinamis adalah kemampuan sistem operasi. Ini memungkinkan executable untuk memanggil fungsi atau menggunakan sumber daya yang disimpan dalam file terpisah. Fungsi dan sumber daya ini dapat dikompilasi dan disebarkan secara terpisah dari executable yang menggunakannya.
DLL bukan executable yang berdiri sendiri. DLL berjalan dalam konteks aplikasi yang memanggilnya. Sistem operasi memuat DLL ke ruang memori aplikasi. Ini dilakukan baik ketika aplikasi dimuat (penautan implisit), atau sesuai permintaan pada runtime (penautan eksplisit). DLL juga memudahkan untuk berbagi fungsi dan sumber daya di seluruh executable. Beberapa aplikasi dapat mengakses konten satu salinan DLL dalam memori secara bersamaan.
Perbedaan antara penautan dinamis dan penautan statis
Penautan statis menyalin semua kode objek dalam pustaka statis ke dalam executable yang menggunakannya saat dibuat. Penautan dinamis hanya mencakup informasi yang diperlukan oleh Windows pada waktu proses untuk menemukan dan memuat DLL yang berisi item data atau fungsi. Saat membuat DLL, Anda juga membuat pustaka impor yang berisi informasi ini. Saat Anda membangun executable yang memanggil DLL, linker menggunakan simbol yang diekspor di pustaka impor untuk menyimpan informasi ini untuk pemuat Windows. Saat loader memuat DLL, DLL dipetakan ke ruang memori aplikasi Anda. Jika ada, fungsi khusus di DLL, DllMain
, dipanggil untuk melakukan inisialisasi apa pun yang diperlukan DLL.
Perbedaan antara aplikasi dan DLL
Meskipun DLL dan aplikasi keduanya adalah modul yang dapat dieksekusi, keduanya berbeda dalam beberapa cara. Perbedaan yang paling jelas adalah Anda tidak dapat menjalankan DLL. Dari sudut pandang sistem, ada dua perbedaan mendasar antara aplikasi dan DLL:
Aplikasi dapat memiliki beberapa instans sendiri yang berjalan di sistem secara bersamaan. DLL hanya dapat memiliki satu instans.
Aplikasi dapat dimuat sebagai proses. Ini dapat memiliki hal-hal seperti tumpukan, utas eksekusi, memori global, handel file, dan antrean pesan. DLL tidak dapat memiliki hal-hal ini.
Keuntungan menggunakan DLL
Penautan dinamis ke kode dan sumber daya menawarkan beberapa keuntungan daripada penautan statis:
Penautan dinamis menghemat memori dan mengurangi pertukaran. Banyak proses dapat menggunakan DLL secara bersamaan, berbagi satu salinan bagian baca-saja dari DLL dalam memori. Sebaliknya, setiap aplikasi yang dibangun dengan menggunakan pustaka yang ditautkan secara statis memiliki salinan lengkap kode pustaka yang harus dimuat Windows ke dalam memori.
Penautan dinamis menghemat ruang disk dan bandwidth. Banyak aplikasi dapat berbagi satu salinan DLL pada disk. Sebaliknya, setiap aplikasi yang dibangun dengan menggunakan pustaka tautan statis memiliki kode pustaka yang ditautkan ke dalam gambar yang dapat dieksekusi. Itu menggunakan lebih banyak ruang disk, dan membutuhkan lebih banyak bandwidth untuk ditransfer.
Pemeliharaan, perbaikan keamanan, dan peningkatan bisa lebih mudah. Saat aplikasi Anda menggunakan fungsi umum dalam DLL, Anda dapat menerapkan perbaikan bug dan menyebarkan pembaruan ke DLL. Ketika DLL diperbarui, aplikasi yang menggunakannya tidak perlu dikombinasikan ulang atau ditautkan ulang. Mereka dapat menggunakan DLL baru segera setelah disebarkan. Sebaliknya, ketika Anda membuat perbaikan dalam kode objek yang ditautkan secara statis, Anda harus menautkan ulang dan menyebarkan ulang setiap aplikasi yang menggunakannya.
Anda dapat menggunakan DLL untuk memberikan dukungan purna pasar. Misalnya, DLL driver tampilan dapat dimodifikasi untuk mendukung tampilan yang tidak tersedia saat aplikasi dikirim.
Anda dapat menggunakan penautan eksplisit untuk menemukan dan memuat DLL saat runtime. Misalnya, ekstensi aplikasi yang menambahkan fungsionalitas baru ke aplikasi Anda tanpa membangun kembali atau menyebarkannya kembali.
Penautan dinamis memudahkan untuk mendukung aplikasi yang ditulis dalam bahasa pemrograman yang berbeda. Program yang ditulis dalam bahasa pemrograman yang berbeda dapat memanggil fungsi DLL yang sama selama program mengikuti konvensi panggilan fungsi. Program dan fungsi DLL harus kompatibel dengan cara berikut: Urutan fungsi mengharapkan argumennya didorong ke tumpukan. Apakah fungsi atau aplikasi bertanggung jawab untuk membersihkan tumpukan. Dan, apakah ada argumen yang diteruskan dalam register.
Penautan dinamis menyediakan mekanisme untuk memperluas kelas pustaka Kelas Microsoft Foundation (MFC). Anda dapat memperoleh kelas dari kelas MFC yang ada dan menempatkannya di DLL ekstensi MFC untuk digunakan oleh aplikasi MFC.
Penautan dinamis membuat pembuatan versi internasional aplikasi Anda lebih mudah. DLL adalah cara mudah untuk menyediakan sumber daya khusus lokal, yang membuatnya jauh lebih mudah untuk membuat versi internasional aplikasi. Alih-alih mengirim banyak versi aplikasi yang dilokalkan, Anda dapat menempatkan string dan gambar untuk setiap bahasa dalam DLL sumber daya terpisah. Kemudian aplikasi Anda dapat memuat sumber daya yang sesuai untuk lokal tersebut saat runtime.
Kerugian potensial untuk menggunakan DLL adalah bahwa aplikasi tidak mandiri. Ini tergantung pada keberadaan modul DLL terpisah: modul yang harus Anda sebarkan atau verifikasi sendiri sebagai bagian dari penginstalan Anda.
Informasi selengkapnya tentang cara membuat dan menggunakan DLL
Artikel berikut ini menyediakan informasi terperinci tentang cara membuat DLL C/C++ di Visual Studio.
Panduan: Membuat dan menggunakan pustaka tautan dinamis (C++)
Menjelaskan cara membuat dan menggunakan DLL menggunakan Visual Studio.
Jenis DLL
Menyediakan informasi tentang berbagai jenis DLL yang dapat dibangun.
Tanya jawab umum DLL
Memberikan jawaban atas pertanyaan yang sering diajukan tentang DLL.
Menautkan executable ke DLL
Menjelaskan penautan eksplisit dan implisit ke DLL.
Menginisialisasi DLL
Membahas kode inisialisasi DLL yang harus dijalankan saat DLL Anda dimuat.
DLL dan perilaku pustaka run-time Visual C++
Menjelaskan urutan startup DLL pustaka run-time.
LoadLibrary dan AfxLoadLibrary
Membahas penggunaan LoadLibrary
dan AfxLoadLibrary
untuk secara eksplisit menautkan ke DLL saat runtime.
GetProcAddress
Membahas penggunaan GetProcAddress
untuk mendapatkan alamat fungsi yang diekspor di DLL.
FreeLibrary dan AfxFreeLibrary
Membahas penggunaan FreeLibrary
dan AfxFreeLibrary
kapan modul DLL tidak lagi diperlukan.
Urutan Pencarian Pustaka Dynamic-Link
Menjelaskan jalur pencarian yang digunakan sistem operasi Windows untuk menemukan DLL pada sistem.
Status modul DLL MFC reguler yang ditautkan secara dinamis ke MFC
Menjelaskan status modul DLL MFC reguler yang ditautkan secara dinamis ke MFC.
DLL ekstensi MFC
Menjelaskan DLL yang biasanya menerapkan kelas yang dapat digunakan kembali yang berasal dari kelas MFC yang ada.
Membuat DLL khusus sumber daya
Membahas DLL khusus sumber daya, yang tidak berisi apa pun kecuali sumber daya, seperti ikon, bitmap, string, dan kotak dialog.
Sumber daya yang dilokalkan dalam Aplikasi MFC: DLL Satelit
Menyediakan dukungan yang ditingkatkan untuk DLL satelit, fitur yang membantu dalam membuat aplikasi yang dilokalkan untuk beberapa bahasa.
Mengimpor dan mengekspor
Menjelaskan mengimpor simbol publik ke dalam aplikasi atau mengekspor fungsi dari DLL
Teknologi aktif dan DLL
Memungkinkan server objek diimplementasikan di dalam DLL.
Otomatisasi dalam DLL
Menjelaskan apa yang disediakan opsi Automation di Wizard DLL MFC.
Konvensi penamaan untuk DLL MFC
Membahas bagaimana DLL dan pustaka yang disertakan dalam MFC mengikuti konvensi penamaan terstruktur.
Memanggil fungsi DLL dari aplikasi Visual Basic
Menjelaskan cara memanggil fungsi DLL dari aplikasi Visual Basic.
Bagian Terkait
Menggunakan MFC sebagai bagian dari DLL
Menjelaskan DLL MFC reguler, yang memungkinkan Anda menggunakan pustaka MFC sebagai bagian dari pustaka tautan dinamis Windows.
Versi DLL MFC
Menjelaskan bagaimana Anda dapat menggunakan MFCxx.dll dan MFCxxD.dll (di mana x adalah nomor versi MFC) pustaka tautan dinamis bersama dengan aplikasi MFC dan DLL ekstensi MFC.