Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Proses secara eksplisit menaut ke panggilan DLL GetProcAddress untuk mendapatkan alamat dari fungsi yang diekspor dalam DLL. Anda menggunakan penunjuk fungsi yang dikembalikan untuk memanggil fungsi DLL.
GetProcAddress mengambil parameter berupa handle modul DLL (dikembalikan oleh LoadLibrary, AfxLoadLibrary, atau GetModuleHandle) dan mengambil nama fungsi yang akan dipanggil atau ordinal ekspor dari fungsi.
Karena Anda memanggil fungsi DLL melalui pointer dan tidak ada pemeriksaan tipe pada saat kompilasi, pastikan parameter untuk fungsi tersebut sudah benar agar Anda tidak melebihi memori yang dialokasikan pada stack dan menyebabkan pelanggaran akses. Salah satu cara untuk membantu memberikan keamanan tipe adalah dengan melihat prototipe fungsi dari fungsi yang diekspor dan membuat typedef yang sesuai dengan pointer fungsi. Contohnya:
typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);
...
HINSTANCE hDLL; // Handle to DLL
LPFNDLLFUNC1 lpfnDllFunc1; // Function pointer
DWORD dwParam1;
UINT uParam2, uReturnVal;
hDLL = LoadLibrary("MyDLL");
if (hDLL != NULL)
{
lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,
"DLLFunc1");
if (!lpfnDllFunc1)
{
// handle the error
FreeLibrary(hDLL);
return SOME_ERROR_CODE;
}
else
{
// call the function
uReturnVal = lpfnDllFunc1(dwParam1, uParam2);
}
}
Cara Anda menentukan fungsi yang Anda inginkan saat memanggil GetProcAddress bergantung pada bagaimana DLL dibuat.
Anda hanya dapat memperoleh ordinal ekspor jika DLL yang Anda tautkan dibangun menggunakan file definisi modul (.def) dan jika ordinal dicantumkan bersama fungsi dalam bagian EKSPOR dari file .def DLL tersebut. Memanggil GetProcAddress dengan ordinal ekspor, dibandingkan dengan nama fungsi, sedikit lebih cepat jika DLL memiliki banyak fungsi yang diekspor karena ordinal ekspor berfungsi sebagai indeks ke dalam tabel ekspor DLL. Menggunakan ordinal ekspor, GetProcAddress dapat menemukan fungsi secara langsung tanpa perlu membandingkan nama yang ditentukan dengan nama fungsi dalam tabel ekspor DLL. Namun, Anda harus memanggil GetProcAddress dengan ordinal ekspor hanya jika Anda memiliki kontrol atas penetapan ordinal ke fungsi yang diekspor dalam file .def.