Run-Time Penautan Dinamis

Ketika aplikasi memanggil fungsi LoadLibrary atau LoadLibraryEx , sistem mencoba menemukan DLL (untuk detailnya, lihat Urutan Pencarian Pustaka Dynamic-Link). Jika pencarian berhasil, sistem memetakan modul DLL ke ruang alamat virtual proses dan menaikkan jumlah referensi. Jika panggilan ke LoadLibrary atau LoadLibraryEx menentukan DLL yang kodenya sudah dipetakan ke ruang alamat virtual proses panggilan, fungsi hanya mengembalikan handel ke DLL dan menambah jumlah referensi DLL. Perhatikan bahwa dua DLL yang memiliki nama dan ekstensi file dasar yang sama tetapi ditemukan di direktori yang berbeda tidak dianggap sebagai DLL yang sama.

Sistem memanggil fungsi titik entri dalam konteks utas yang disebut LoadLibrary atau LoadLibraryEx. Fungsi titik entri tidak dipanggil jika DLL sudah dimuat oleh proses melalui panggilan ke LoadLibrary atau LoadLibraryEx tanpa panggilan yang sesuai ke fungsi FreeLibrary .

Jika sistem tidak dapat menemukan DLL atau jika fungsi titik entri mengembalikan FALSE, LoadLibrary atau LoadLibraryEx mengembalikan NULL. Jika LoadLibrary atau LoadLibraryEx berhasil, loadLibraryEx mengembalikan handel ke modul DLL. Proses ini dapat menggunakan handel ini untuk mengidentifikasi DLL dalam panggilan ke fungsi GetProcAddress, FreeLibrary, atau FreeLibraryAndExitThread .

Fungsi GetModuleHandle mengembalikan handel yang digunakan di GetProcAddress, FreeLibrary, atau FreeLibraryAndExitThread. Fungsi GetModuleHandle hanya berhasil jika modul DLL sudah dipetakan ke ruang alamat proses dengan penautan waktu muat atau dengan panggilan sebelumnya ke LoadLibrary atau LoadLibraryEx. Tidak seperti LoadLibrary atau LoadLibraryEx, GetModuleHandle tidak meningkatkan jumlah referensi modul. Fungsi GetModuleFileName mengambil jalur lengkap modul yang terkait dengan handel yang dikembalikan oleh GetModuleHandle, LoadLibrary, atau LoadLibraryEx.

Proses ini dapat menggunakan GetProcAddress untuk mendapatkan alamat fungsi yang diekspor di DLL menggunakan handel modul DLL yang dikembalikan oleh LoadLibrary atau LoadLibraryEx, GetModuleHandle.

Ketika modul DLL tidak lagi diperlukan, prosesnya dapat memanggil FreeLibrary atau FreeLibraryAndExitThread. Fungsi-fungsi ini mengurangi jumlah referensi modul dan membatalkan peta kode DLL dari ruang alamat virtual proses jika jumlah referensi adalah nol.

Penautan dinamis run-time memungkinkan proses untuk terus berjalan meskipun DLL tidak tersedia. Prosesnya kemudian dapat menggunakan metode alternatif untuk mencapai tujuannya. Misalnya, jika proses tidak dapat menemukan satu DLL, proses dapat mencoba menggunakan DLL lain, atau dapat memberi tahu pengguna tentang kesalahan. Jika pengguna dapat memberikan jalur lengkap DLL yang hilang, prosesnya dapat menggunakan informasi ini untuk memuat DLL meskipun tidak berada di jalur pencarian normal. Situasi ini berbeda dengan penautan waktu muat, di mana sistem hanya menghentikan proses jika tidak dapat menemukan DLL.

Penautan dinamis run-time dapat menyebabkan masalah jika DLL menggunakan fungsi DllMain untuk melakukan inisialisasi untuk setiap utas proses, karena titik entri tidak dipanggil untuk utas yang ada sebelum LoadLibrary atau LoadLibraryEx dipanggil. Untuk contoh yang menunjukkan cara menangani masalah ini, lihat Menggunakan Penyimpanan Lokal Utas di Pustaka Dynamic-Link.

Menggunakan Penautan Dinamis Run-time