本文转自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; }
使用的例子:
#includetypedef 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 ); } 是不是很好用呢 囧