天天看点

dll加载之简便方法

介绍

  通常我们动态加载DLL, 使用LoadLibrary和GetProcAddress, 然后检测每个函数地址是否是NULL, 这个下面看看加载DLL的简便之法。

代码如下:

#include <windows.h>

//GetProcAddresses

//参数1:hLibrary      -要加载动态连接库的句柄

//参数2:lpszLibrary   -要加载的动态连接库

//参数3:nCount        -要加载的函数个数

//[参数格式化]

//参数4  函数地址

//参数5  函数名

//返回值,成功(TRUE), 失败(FALSE)

BOOL GetProcAddresses(HINSTANCE* hLibrary,

     LPCSTR lpszLibrary, INT nCount, ...)

{

 va_list va;

 va_start(va, nCount);

 //加载DLL

 if ((*hLibrary = LoadLibrary(lpszLibrary)) != NULL)

 {

  FARPROC* lpfProcFuction = NULL;

  LPSTR lpszFunName = NULL;

  INT nIdxCount = 0;

  while (nIdxCount < nCount)

  {

   lpfProcFuction = va_arg(va, FARPROC*);

   lpszFunName  =  va_arg(va, LPSTR);

   //获取函数地址

   if ((*lpfProcFuction= GetProcAddress(*hLibrary, lpszFunName)) == NULL)

   {

    lpfProcFuction = NULL;

       return FALSE;

   }

   nIdxCount++;

  }

 }

 else

 {

  va_end(va);

  return FALSE;

 }

 va_end(va);

 return TRUE;

}

//定义函数指针类型

typedef int (WINAPI* MESSAGEBOX)

       (HWND, LPCSTR, LPCSTR, DWORD);

typedef int (WINAPI* MESSAGEBOXEX)

       (HWND, LPCSTR, LPCSTR, DWORD, WORD);

int main(int argc, char* argv[])

{

 MESSAGEBOX lpfMsgBox = NULL;

 MESSAGEBOXEX lpfMsgBoxEx = NULL; 

 HINSTANCE hLib;

    if (GetProcAddresses(&hLib, "C://WINDOWS//system32//User32.dll", 2,

   &lpfMsgBox, "MessageBoxA",

   &lpfMsgBoxEx, "MessageBoxExA"))

 {

  lpfMsgBox(0, "Test1", "Test1", MB_OK);

  lpfMsgBoxEx(0, "Test2", "Test2", MB_OK,

   MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));

 }

 if (NULL != hLib)

 {

  FreeLibrary(hLib);

 }

 return 0;

}