显示调用动态链接库

来源:互联网 发布:大观园网络电视 编辑:程序博客网 时间:2024/06/14 15:53

李国帅 编写于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 successfulBOOL 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总是不能引用成功,原来没有注册。

原创粉丝点击