注:
dll: 表示my.dll檔案
lib: 表示my.lib檔案
c++ 呼叫.lib的方法:
1 設定工程的 projects來載入dll的lib檔案
開啟工程的 projects選單,然後在linker/additional library directories中加入lib檔案所在的路徑,在input/additional dependencies加入lib檔名稱,如(my.lib) ,然後在要使用該函式的地方加上該lib的標頭檔案,如#include "..\lib.h"即可(沒有標頭檔案當然就不用了),而且應用程式執行時也需要dll檔案。
32 通過程式**的方式
加入預編譯指令#pragma comment (lib,"*.lib"),這種方法優點是可以利用條件預編譯指令鏈結不同版本的lib檔案。因為,在debug方式下,產生的lib檔案是debug版本,如regd.lib;在release方式下,產生的lib檔案是release版本,如regr.lib。然後在首先要使用該函式的地方加上該lib的標頭檔案,如#include "..\lib.h"即可(沒有標頭檔案當然就不用了)。
當應用程式對鏈結庫的lib檔案載入後,還需要把鏈結庫對應的標頭檔案(*.h)包含到其中,在這個標頭檔案中給出了鏈結庫中定義的函式原型。
二, 顯式的呼叫鏈結庫 隱式鏈結雖然實現較簡單,但除了必須的*.dll檔案外還需要dll的*.**件和*.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");
靜態鏈結庫lib和動態鏈結庫dll的區別
1.什麼是靜態連線庫,什麼是動態鏈結庫 靜態鏈結庫與動態鏈結庫都是共享**的方式,如果採用靜態鏈結庫,則無論你願不願意,lib 中的指令都全部被直接包含在最終生成的 exe 檔案中了。但是若使用 dll,該 dll 不必被包含在最終 exe 檔案中,exe 檔案執行時可以「動態」地引用和解除安裝這個與 exe 獨立的 dll 檔案。靜態鏈結庫和動態鏈結庫的另外乙個區別在於靜態鏈結庫中不能再包含其他的動態鏈結庫或者靜態庫,而在動態鏈結庫中還可以再包含其他的動態或靜態鏈結庫。靜態鏈結庫與靜態鏈結庫呼叫規則總體比較如下。
生成庫的.h標頭檔案中的宣告格式如下: extern "c" 函式返回型別 函式名(參數列); 在呼叫程式的.cpp源**檔案中如下: #include "..\lib.h" #pragma comment(lib,"..\\debug\\libtest.lib") //指定與靜態庫一起鏈結
第二,因為靜態鏈結庫是將全部指令都包含入呼叫程式生成的exe檔案中。因此如果用的是靜態鏈結庫,那麼也就不存在「匯出某個函式提供給使用者使用」的情況,要想用就得全要!要不就都別要!:)
*.**件主要是知道函式原型使用。 首先我們必須先注意到dll內的函式分為兩種: (1)dll 匯出函式,可**用程式呼叫; (2)dll 內部函式,只能在 dll 程式使用,應用程式無法呼叫它們。 因此呼叫程式若想呼叫dll中的某個函式就要以某種形式或方式指明它到底想呼叫哪乙個函式。
VS2010呼叫幫助文件
1 新增htmlhelp.h標頭檔案和htmlhelp.lib庫。在專案 屬性 聯結器 輸入的附加依賴項中加入htmlhelp.lib庫檔案,然後在聯結器 常規 附加庫目錄中加入htmlhelp.lib的目錄位置。然後再工程中加入標頭檔案 include htmlhelp.h 2 開始編寫程式。tc...
在VS2010中呼叫MATLAB生成的DLL
最近需要製作乙個c的外掛程式,需要使用matlab 所以想通過c語言呼叫matlab的動態鏈結庫實現。以下實現過程參考了matlab的help 編譯環境 matlab2014a visual studio2010 首先,在matlab中新建乙個.m檔案,命名為dll test.m並儲存,內容如下 f...
VS 2010專案中新增lib庫
vs 2010專案中新增lib庫 應用程式使用外部庫時需要進行載入,兩種庫的載入本質上都是一樣 提供功能和功能的定義。vs2005 c 專案設定外部庫方法如下 1.新增編譯所需要 依賴 的 lib 檔案 在 專案 屬性 配置屬性 聯結器 輸入 附加依賴項 裡填寫 winsock.lib 多個 lib...