調用靜態鏈接庫和動態鏈接庫

調用靜態鏈接庫

靜態鏈接庫由.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文件。

 

動態鏈接庫一般包括.lib(導出函數),.h,.dll,使用動態庫有兩種情況:

 

1隱式鏈接,同使用靜態庫相似,分爲三步:引用.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");

 

發佈了20 篇原創文章 · 獲贊 9 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章