介绍
通常我们动态加载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;
}