天天看點

如何使用動态連結庫(dll)檔案

這是我從本人的chianunix上搬過來的,文章連結為:http://blog.chinaunix.net/uid-26642637-id-3312818.html。

這個問題是我在使用sqlite3時遇到的,在我的程式中需要用到sqlite資料庫。但是在官網上下載下傳的sqlite開發包中隻有sqlite3.dll和sqlite3.def檔案。

要想在自己的程式調用sqlite3中的函數,有兩種方法--動态連結(隐式連結)和靜态連結(顯式連結)。

第一種:動态連結主要是利用LoadLibrary、GetProcAddress、FreeLibrary這三個api。

LoadLibrary

HINSTANCE LoadLibrary(LPCTSTR lpLibFileName);

The LoadLibrary function maps the specified executable module into the address space of the calling process. 

這個函數就是映射可執行子產品的位址到調用這個函數的程序中,以便這個程序能夠調用可執行子產品中的函數。

輸入參數: lpLibFileName 指向一個可執行子產品的名字的字元串,在這裡也就是指向"sqlite3.dll"的字元指針,你也可以加路徑,請注意要用back slashes(\)代替forward slashes(/)。具體的請參看MSDN。

傳回值:成功的話就傳回這個可執行子產品的句柄(下面要用),否則傳回NULL。

GetProcAddress

FARPROC GetProcAddress(  HMODULE hModule,  LPCSTR lpProcName );

The GetProcAddress function returns the address of the specified exported dynamic-link library (DLL) function.

這個函數傳回動态連結庫(DLL)中指定函數的位址,為了下面可以調用這個指定的函數。

輸入參數:

hModule 就是調用LoadLibrary得到的句柄。

lpProcName字元指針,指向函數名(這個函數必須是dll中定義的函數)。

傳回值:函數指針,是對應上面函數名的函數的入口位址。

FreeLibrary

BOOL FreeLibrary( HMODULE hLibModule  );

The FreeLibrary function decrements the reference count of the loaded dynamic-link library (DLL) module. When the reference count reaches zero, the module is unmapped from the address space of the calling process and the handle is no longer valid. 

這個函數就是釋放我們load的dll子產品。當有多次load的時候,我們一次釋放一個。

輸入參數:就是上面調用LoadLibrary得到的句柄。

傳回值:失敗為0,否則為非0

下面給出一個小例子:

typedef int(*SQLITE3_OPEN)(const char *filename,sqlite3 **ppdb);

SQLITE3_OPEN sqlite3_open;

HINSTANCE hdll;

int init_dll_function(void)

{

      hdll=LoadLibrary("sqlite3.dll");

      if(hdll==NULL){printf("Error to LoadLibrary!\n");return 1;}

      sqlite3_open=(SQLITE3_OPEN)GetProcAddress(hdll,"sqlite3_open"); 

      if(sqlite3_open==NULL){

            printf("Error!\n");

            return 1;

      }

if(!FreeLibrary(hdll)){

return 1;

}

return 0;

}

第二種:靜态(顯式)連結

第一步:

這個比較簡單,首先利用def檔案生成一個lib檔案。

如何用def檔案生成一個lib檔案?

到C:\Program Files\Microsoft Visual Studio\VC98\Bin下(如果VC是裝在C槽的話),用CMD進入到這個目錄下,然後利用lib.exe這個程式來生成所要的lib。具體的指令是:LIB /DEF:sqlite3.def /machine:IX86

。你運作了這個指令發現會有問題,因為這邊預設是sqlite3.def在目前檔案夾下(C:\Program Files\Microsoft Visual Studio\VC98\Bin),如果你這個檔案不在這個檔案夾下,那麼就會出錯,你隻要把sqlite3.def檔案複制到這個檔案夾下就可以了,然後生成的lib檔案也是在這個檔案夾下的,你可以将它複制到你需要的地方。

注意:好像有的VC在安裝的時候差什麼檔案,運作lib.exe指令的時候會出錯,你隻要找到那個差的檔案并複制到目前的檔案夾下,就可以了。(那個缺少檔案有可能是放在其他檔案夾了,你可以查找一下,我的就是這種情況)。

第二步:在程式中添加#pragma comment(lib,"sqlite3.lib") ,并且添加相應的頭檔案(sqlite3.h).

第三步:就在程式中調用你想要調用的函數。

繼續閱讀