vc下DLL lib的呼叫

2021-04-13 23:16:09 字數 2329 閱讀 9614

1、簡介:

dll和.lib都是程式集合,便於**重用。都是二進位制的檔案。

.dll也叫動態鏈結庫,與程式鏈結的方式為執行時鏈結(run-time linked),為pe(portable executable)格式,也 就是程完整的程式。.exe、.dll、.fon、.mod、.drv、.ocx等等都是動態鏈結庫。如.exe為系統呼叫的函式集合。.dll不存在同 名引用,且有匯出表,與匯入表。

.lib也叫靜態鏈結庫,在編譯時與程式鏈結(link-time linked),將「嵌入」到程式中。會有冗餘(程式檔案**的冗餘和執行時記憶體儲存 的冗餘),當兩個lib相鏈結時位址會重新建立同。在使用.lib之前,要在程式源**中引用lib對應的標頭檔案.h,這些標頭檔案告訴編譯器.lib中有 什麼。

在生成.dll時,通常會生成乙個.lib。這個.lib將被編譯到程式檔案中,在程式執行的時候,告訴作業系統將要載入的.dll。這個.lib包括對 應.dll的檔名、順序表(ordinal table包含.dll暴露出的函式的進入點),在程式執行的時候,通過順序表實現函式的跳轉。

如果不想使用或者找不到該.lib,可以用loadlibrary () win32 api和getlibrary () win32 api。

vc ide為了實現程式除錯,會生成.pdb(程式資料庫,二進位制),裡面包含原始檔呼叫的檔案資訊和行資訊。這樣就可以逐行除錯了。

開啟.lib,檢視其ascii碼,可以看到如@@my_function1123的函式名,這些名稱在編譯時被編譯器運用mangling mechani**進行了名稱的mangling。

在程式的編譯過程中,如果出現如下錯誤「unresolved symbol _some_funtion@1234」,通常是因為找不到引用過的外部函式對應的.lib檔案,或者是.c、.cpp原始檔。

2、使用:

1、隱式的載入時鏈結

這種方法需要dll工程經編譯產生的lib檔案,此檔案中包含了dll允許應用程式呼叫的所有函式的列表,當鏈結器發現應用程式呼叫了lib檔案列出的 某個函式,就會在應用程式的可執行檔案的檔案映像中加入一些資訊,這些資訊指出了包含這個函式的dll檔案的名字。當這個應用程式執行時,也就是它的可執 行檔案被作業系統產生映像檔案時,系統會檢視這個映像檔案中關於dll的資訊,然後將這個dll檔案映像到程序的位址空間。

·程式執行時的目錄,即可執行檔案所在的目錄;

·當前程式工作目錄

·系統目錄:對於windows95/98來說,可以呼叫getsystemdirectory函式來得到,對於windowsnt/2000來說,指 的是32位windows的系統目錄,也可以呼叫getsystemdirectory函式來得到,得到的值為system32。

·windows目錄

·列在path環境變數中的所有目錄

vc中載入dll的lib檔案的方法有以下三種:

①lib檔案直接加入到工程檔案列表中

在vc中開啟file view一頁,選中工程名,單擊滑鼠右鍵,然後選中"add files to project"選單,在彈出的檔案對話方塊中選中要加入dll的lib檔案即可。

②設定工程的 project settings來載入dll的lib檔案

開啟工程的 project settings選單,選中link,然後在object/library modules下的文字框中輸入dll的lib檔案。

③通過程式**的方式

加入預編譯指令#pragma comment (lib,"*.lib"),這種方法優點是可以利用條件預編譯指令鏈結不同版本的lib檔案。因為,在debug方式下,產生的lib檔案是debug 版本,如regd.lib;在release方式下,產生的lib檔案是release版本,如regr.lib。

當應用程式對dll的lib檔案載入後,還需要把dll對應的標頭檔案(*.h)包含到其中,在這個標頭檔案中給出了dll中定義的函式原型,然後宣告。

2、顯式的執行時鏈結

隱式鏈結雖然實現較簡單,但除了必須的*.dll檔案外還需要dll的*.h檔案和*.lib檔案,在那些只提供*.dll檔案的場合就無法使用,而只 能採用顯式鏈結的方式。這種方式通過呼叫api函式來完成對dll的載入與解除安裝,其能更加有效地使用記憶體,在編寫大型應用程式時往往採用此方式。這種方法 程式設計具體實現步驟如下:

①使用windows api函式load library或者mfc提供的afxloadlibrary將dll模組映像到程序的記憶體空間,對dll模組進行動態載入。

②使用getprocaddress函式得到要呼叫dll中的函式的指標。

③不用dll時,用free library函式或者afxfreelibrary函式從程序的位址空間顯式解除安裝dll。

轉貼:http://blog.csdn.net/swmp/archive/2006/03/23/633204.aspx

dll lib 宣告與呼叫

宣告匯出函式 h匯出 extern c datatype declspec dllexport function parameter list def 匯出 lib.def 匯出dll函式 library export dll name exports fun name idx def 檔案的規則為...

VC 呼叫libcurl的VC庫使用詳解

1.開發環境。我這裡環境是vc net 2003 windows xp sp3.不帶ssl的 http curl.haxx.se download libcurl 7.18.0 win32 msvc.zip 帶ssl的 http curl.haxx.se download libcurl 7.19....

VC 呼叫外部程式

有三種sdk函式可以呼叫,分別是 winexec,shellexecute,createprocess 其中以winexec最為簡單,主要是呼叫windows程式.shellexecute比winexec靈活一些,主要是呼叫dos程式。createprocess最為複雜但是使用最靈活。1.winex...