呼叫靜態鏈結庫和動態鏈結庫

2021-06-05 21:52:36 字數 2378 閱讀 1366

呼叫靜態鏈結庫

靜態鏈結庫由.h和.lib檔案組成,.h檔案在工程中用來宣告,而.lib檔案包含供外界呼叫的函式的原型。

vc 6.0中呼叫靜態鏈結庫.lib共3種方法:

1.首先使用語句#include "lib.h",並將lib.h拷貝到當前工程目錄下;

接著對staticlib_smp.lib使用語句 #pragma comment(lib,"***\\staticlib_smp.lib"),將static_smp.lib拷貝到目錄"***\\staticlib_smp .lib"下。   

2.首先使用語句#include 「lib.h",並在工具->選項->目錄->路徑中新增lib.h的路徑;

接著對staticlib_s mp.lib,在工程->設定->連線->物件/庫模組中新增staticlib_smp.lib,並在工具->選項->目錄->路徑中新增staticlib_smp.lib的路徑。

3.首先使用語句#include 「lib.h",接著對staticlib_smp.lib,在工程->新增到工程->檔案中匯入此.lib檔案。

2動態載入,直接使用loadlibrary 載入所需的動態庫,然後指定所需的匯出函式,效率最高!

1. 隱式的載入時鏈結

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。

例:在應用程式中呼叫dll檔案

——在應用程式中要首先裝入dll後才能呼叫匯出表中的函式,例如用mfc

建立基於對話方塊的工程test,並在對話方塊上放置"load"按鈕,先新增裝載**。

1.首先在testdlg.cpp的首部新增變數設定**:

//設定全域性變數glibsample用於儲存dll控制代碼

hinstance  glibsample=null;   //如果定義成handle型別,則出錯

//第二個變數showme是指向dll

庫中showme()函式的指標

typedef int(* showme)(void);

showme showme;

2.利用classwizard為"load"按鈕新增裝載dll的**

void ctestdlg::onloadbutton()

//要新增的**如下

if(glibsample!=null)

afxmessagebox("the sample.dll has already been load.");

return;

//裝載sample.dll,未加路徑,將在三個預設路徑中尋找 (1)windows的系統目錄:\windows\system;

//(2)dos中path所指出的任何目錄;

//(3)程式所在的目錄;

glibsample=loadlibrary("sample.dll");

//返回dll中showme()函式的位址

showme=(showme)getprocaddress(glibsample,"showme");

靜態鏈結庫和動態鏈結庫

其實再vc中,我們所用得所有api函式都封裝再下列三個dll檔案中 kernel32.dll 用於管理記憶體,程序和執行緒得各個函式 user32.dll 用於執行使用者介面任務,如視窗的建立和訊息的傳遞的各個函式 gdi32.dll 用於顯示文字和畫圖的各個函式 動態鏈結庫 我們再使用動態庫的時候...

靜態鏈結庫和動態鏈結庫

靜態鏈結庫 win32 static library 呼叫libtest.lib 動態dll win32 dynamic link library 跟librest的生成是一樣的 動態呼叫 成的.lib 和.dll 檔案拷入dllcall 工程所在的路徑,dllcall 執行下列 dll 中匯出函式...

靜態鏈結庫和動態鏈結庫

以前的時候寫過這方面的部落格,當時寫的時候都覺得已經懂了。今天閒著沒事幹,和咚哥他們去大華校招筆試遇到了這個問題。我突然間發現sdk沒寫三個月,把dll都忘記了。回來看了下,複習下。以前寫過程式的裝載和鏈結的部落格,那是os上面比較理論的。實際用函式庫的時候主要分為,靜態庫和動態庫,這裡就簡簡單單地...