Bagikan melalui


Run-Time Dynamic Linking

Saat aplikasi memanggilLoadLibraryatau fungsiLoadLibraryEx, sistem mencoba menemukan DLL (untuk detailnya, lihat Dynamic-Link Library Search Order). 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 meningkatkan 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 masuk dalam konteks utas yang disebutLoadLibraryatau LoadLibraryEx. Fungsi titik entri tidak dipanggil jika DLL sudah dimuat oleh proses melalui panggilan ke LoadLibrary atau LoadLibraryEx tanpa panggilan yang sesuai ke fungsiFreeLibrary.

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

FungsiGetModuleHandlemengembalikan handel yang digunakan dalamGetProcAddress , FreeLibrary, atau FreeLibraryAndExitThread. Fungsi GetModuleHandle berhasil hanya 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. FungsiGetModuleFileNamemengambil jalur lengkap modul yang terkait dengan handel yang dikembalikan oleh GetModuleHandle, LoadLibrary, atau LoadLibraryEx.

Proses ini dapat menggunakanGetProcAddressuntuk mendapatkan alamat fungsi yang diekspor di DLL menggunakan handel modul DLL yang dikembalikan olehLoadLibraryatau 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, proses ini 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 mengakhiri proses jika tidak dapat menemukan DLL.

Penautan dinamis run-time dapat menyebabkan masalah jika DLL menggunakan fungsiDllMain untuk melakukan inisialisasi untuk setiap utas proses, karena titik masuk 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