本文转自codeprojcet http://www.codeproject.com/KB/DLL/dllease.aspx
load dll也就是load dll中的函数,一般是loadlibrary,GetProcAddress,每一步都要判断函数返回是否正确,比较繁琐,
该作者干脆做了个封装,将这些重复步骤封装到一个bool的函数中,这样只要在if语句中调用一下可以了,具体来看代码:这里用到了c语言的可变参数,对此俺也不是很了解
//GetProcAddresses
//Argument1: hLibrary - Handle for the Library Loaded
//Argument2: lpszLibrary - Library to Load
//Argument3: nCount - Number of functions to load
//[Arguments Format]
//Argument4: Function Address - Function address we want to store
//Argument5: Function Name - Name of the function we want
//[Repeat Format]
//
//Returns: FALSE if failure
//Returns: TRUE if successful
BOOL GetProcAddresses( HINSTANCE *hLibrary,
LPCSTR lpszLibrary, INT nCount, ... )
{
va_list va;
va_start( va, nCount );
if ( ( *hLibrary = LoadLibrary( lpszLibrary ) )
!= NULL )
{
FARPROC * lpfProcFunction = NULL;
LPSTR lpszFuncName = NULL;
INT nIdxCount = 0;
while ( nIdxCount < nCount )
{
lpfProcFunction = va_arg( va, FARPROC* );
lpszFuncName = va_arg( va, LPSTR );
if ( ( *lpfProcFunction =
GetProcAddress( *hLibrary,
lpszFuncName ) ) == NULL )
{
lpfProcFunction = NULL;
return FALSE;
}
nIdxCount++;
}
}
else
{
va_end( va );
return FALSE;
}
va_end( va );
return TRUE;
}
使用的例子:
#include typedef int ( WINAPI *MESSAGEBOX ) ( HWND , LPCSTR, LPCSTR, DWORD ); typedef int ( WINAPI *MESSAGEBOXEX ) ( HWND , LPCSTR, LPCSTR, DWORD , WORD ); void main(void) { MESSAGEBOX lpfMsgBox = NULL; MESSAGEBOXEX lpfMsgBoxEx = NULL; HINSTANCE hLib; if(GetProcAddresses( &hLib, "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 ( hLib != NULL ) FreeLibrary( hLib ); }是不是很好用呢 囧