1. 程式人生 > >C++呼叫.lib的方法

C++呼叫.lib的方法

C++呼叫.lib的方法

1. 隱式載入

1. 隱式載入連結,有三種方法:

1. LIB檔案直接加入到工程檔案列表中。

VC中開啟File View一頁,選中工程名,單擊滑鼠右鍵,然後選中"Add Files to Project"選單,在彈出的檔案對話方塊中選中要加入DLLLIB檔案。然後在首先要使用該函式的地方加上該LIB的標頭檔案,如#include "..\lib.h"即可(沒有標頭檔案當然就不用了)。

2. 設定工程的 Project Settings來載入DLLLIB檔案。

開啟工程的 Project Settings選單,選中Link,然後在Object/library modules

下的文字框中輸入DLLLIB檔案,如you.lib(或者lib檔案的路徑,包括檔名)。然後在首先要使用該函式的地方加上該LIB的標頭檔案,如#include "..\lib.h"即可(沒有標頭檔案當然就不用了)。

3. 通過程式程式碼的方式。

加入預編譯指令#pragma comment (lib,"*.lib"),這種方法優點是可以利用條件預編譯指令連結不同版本的LIB檔案。因為,在Debug方式下,產生的LIB檔案是Debug版本,如Regd.lib;在Release方式下,產生的LIB檔案是Release版本,如Regr.lib。然後在首先要使用該函式的地方加上該LIB的標頭檔案,如

#include "..\lib.h"即可(沒有標頭檔案當然就不用了)。

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

2. 顯式載入

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

  1. 使用Windows API
    函式Load Library或者MFC提供的AfxLoadLibrary()DLL模組映像到程序的記憶體空間,對DLL模組進行動態載入。
  2. 使用GetProcAddress函式得到要呼叫DLL中的函式的指標。
  3. 不用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)dospath所指出的任何目錄;

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

glibsample=Loadlibrary("sample.dll");

//返回dllshowme()函式的地址

showme=(Showme)GetProcAddress(glibsample,"showme");

靜態連結庫LIB和動態連結庫DLL的區別

1. 什麼是靜態連線庫,什麼是動態連結庫

靜態連結庫與動態連結庫都是共享程式碼的方式,如果採用靜態連結庫,則無論你願不願意,lib 中的指令都全部被直接包含在最終生成的 EXE 檔案中了。但是若使用 DLL,該 DLL 不必被包含在最終 EXE 檔案中,EXE 檔案執行時可以“動態”地引用和解除安裝這個與 EXE 獨立的 DLL 檔案。靜態連結庫和動態連結庫的另外一個區別在於靜態連結庫中不能再包含其他的動態連結庫或者靜態庫,而在動態連結庫中還可以再包含其他的動態或靜態連結 庫。靜態連結庫與靜態連結庫呼叫規則總體比較如下。

對於靜態連結庫(比較簡單)

首先,靜態連結庫的使用需要庫的開發者提供生成庫的.h標頭檔案和.lib檔案。

生成庫的.h標頭檔案中的宣告格式如下:

extern "C" 函式返回型別 函式名(引數表);

在呼叫程式的.cpp原始碼檔案中如下:

#include "..\lib.h"

#pragma comment(lib,"..\\debug\\libTest.lib")

//指定與靜態庫一起連結

第二,因為靜態連結庫是將全部指令都包含入呼叫程式生成的EXE檔案中。因此如果用的是靜態連結庫,那麼也就不存在“匯出某個函式提供給使用者使用”的情況,要想用就得全要,要不就都別要。

對於動態連結庫:

動態連結庫的使用需要庫的開發者提供生成的.lib檔案和.dll檔案。或者只提供dll檔案。

首先我們必須先注意到DLL內的函式分為兩種:

(1)DLL 匯出函式,可供應用程式呼叫;

(2)DLL 內部函式,只能在 DLL 程式使用,應用程式無法呼叫它們。

因此呼叫程式若想呼叫DLL中的某個函式就要以某種形式或方式指明它到底想呼叫哪一個函式。