李国帅 编写于2006-5-10 15:16
参考调用链接库的方法可以看出,使用显示调用要好得多,可以更好的节省动态内存空间.
如果要找代码,codeproject是首选.一个简单的调用例程
#include "windows.h" //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; } 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 ); }
自定义的dll也是可以的.
typedef int ( WINAPI *CREATEDLL3 )(); CREATEDLL3 lpfCreateDll3 = NULL; HINSTANCE hLib; if(GetProcAddresses( &hLib, "DLL3.dll", 1, &lpfCreateDll3, "CreateDll3")) { lpfCreateDll3(); } |
当时使用vc7生成了一个win32dll能够调用dll文件,但是不能调用里面自动生成的函数,可以看到里面的函数表示和mfc的不同。
我使用前面的josua改动过的dll,dll根本不能调用。
只好使用隐式调用了。直接引用项目,先运行了再说。
我知道了为什么winrtp atlcom总是不能引用成功,原来没有注册。