Share via


GetProcAddress

Proses secara eksplisit menautkan ke panggilan DLL GetProcAddress untuk mendapatkan alamat fungsi yang diekspor di DLL. Anda menggunakan penunjuk fungsi yang dikembalikan untuk memanggil fungsi DLL. GetProcAddress mengambil sebagai parameter handel modul DLL (dikembalikan oleh LoadLibrary, AfxLoadLibrary, , atau GetModuleHandle) dan mengambil nama fungsi yang ingin Anda panggil atau ordinal ekspor fungsi.

Karena Anda memanggil fungsi DLL melalui penunjuk dan tidak ada pemeriksaan jenis waktu kompilasi, pastikan bahwa parameter ke fungsi sudah benar sehingga Anda tidak melampaui memori yang dialokasikan pada tumpukan dan menyebabkan pelanggaran akses. Salah satu cara untuk membantu memberikan keamanan jenis adalah dengan melihat prototipe fungsi fungsi yang diekspor dan membuat typedef yang cocok untuk 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 dengan file definisi modul (.def) dan jika ordinal tercantum dengan fungsi di bagian EKSPOR dari file .def DLL. 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. Dengan ordinal ekspor, GetProcAddress dapat menemukan fungsi secara langsung dibandingkan dengan 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.

Apa yang ingin Anda lakukan?

Apa yang ingin Anda ketahui lebih lanjut?

Baca juga

Membuat C/C++ DLL di Visual Studio