MFC DLL靜態鏈結

2021-06-20 01:33:41 字數 2564 閱讀 5764

1、vc定

義的三種

型別dl

l有什麼

區別----

2、mfc dll 的三種型別----

在使用嚮導建立基於mfc的dll時,有如下三種型別

mfc擴充套件dll

使用mfc擴充套件dll,產生的dll只能與mfc客戶程式一起工作。他可以匯出c++類給客戶端。匯出的函式可以使用c++/mfc資料型別作為引數或返回值,匯出乙個類時,客戶端能建立類物件或者派生這個類。同時,在dll中也可以使用dll和mfc。

vc的mfc類庫也儲存在乙個dll中,mfc擴充套件dll動態鏈結到mfc**庫的dll,客戶程式也因此需要動態鏈結到mfc**庫的dll。由於mfc**庫的dll存在多個版本,客戶程式和擴充套件dll都必須使用相同版本的mfc**dll。為了讓mfc擴充套件dll能很好的工作,擴充套件dll和客戶程式需要動態鏈結到mfc**dll,而這個dll必須在客戶程式執行的計算機上存在。

規則dll:

mfc擴充套件dll只能和mfc客戶程式一起工作,採用規則dll,可以使用更廣泛的dll,它不受mfc的限制。缺點是不能傳送指標或mfc派生類和物件的引用,即規則dll和客戶程式的介面(函式簽名部分)不能使用mfc。但在dll和客戶程式內部,還是可以使用mfc。

在使用規則dll時,有動態鏈結和靜態鏈結之分。

如果是動態鏈結,表示規則dll需要的mfc**沒有構建到dll中,這類似於擴充套件dll,需要 保證在執行dll的計算機上必須要有含有mfc**庫的dll。

如果是靜態鏈結,規則dll中已經包含了需要的mfc**,因此他得體積將比較大,但他可以在沒有包含mfc**庫的計算機上正常執行。

示例:一、建立dll

1、建立專案 dlldemo,選擇mfc dll模板,選擇「使用共享mfc dll」的規則dll選項,單擊完成

2、在標頭檔案中,新增如下外部函式宣告

[cpp]view plain

copy

// 有關此類實現的資訊,請參閱 dlldemo.cpp

//extern

"c"void

pascal export hintbox();  

class

public

;  

3、在實現檔案中,對此函式進行實現

[cpp]view plain

copy

bool

extern

"c"void

pascal export hintbox()  

4、在dlldemo.def檔案中新增匯出資訊

[cpp]view plain

copy

; dlldemo.def : 宣告 dll 的模組引數。  

library  

exports  

; 此處可以是顯式匯出  

hintbox  

二、呼叫dll

1、新建乙個專案calldlldemo,選擇基於formview的單文件框架,在form上新增乙個按鈕button,新增按鈕的事件處理程式

2、在事件處理程式中新增如下**

[cpp]view plain

copy

// ccalldlldemoview 訊息處理程式

void

ccalldlldemoview::onbnclickedbutton1()    

提示出錯,說明未能識別hintbox函式,接下去採用靜態鏈結的方式完成hintbox呼叫。

3、為專案新增鏈結靜態庫的目錄

4、在calldlldemoview.cpp的頂部,新增如下資訊

[cpp]view plain

copy

#ifndef shared_handlers

#include "calldlldemo.h"

#endif

#include "calldlldemodoc.h"

#include "calldlldemoview.h"

#include "..\dlldemo\dlldemo.h"

#pragma comment(lib,"dlldemo.lib")

倒數第二行需要新增hintbox的標頭檔案,倒數第一行,引入dlldemo.lib靜態庫

三、採用動態載入dll來實現呼叫

如上完成第一步後,只需新增如下**,即可實現同樣效果

[cpp]view plain

copy

typedef

int(* func)();  

……  

void

ccalldlldemo2view::onbnclickedbutton1()  

_func = (func)getprocaddress(hinstlibrary,"hintbox"

);  

if(_func!=null)  

freelibrary(hinstlibrary);  

}  

動態鏈結 靜態鏈結

在linux系統中,ld鏈結器將彙編器編譯出來的目標檔案和靜態庫里的.a檔案鏈結生成可執行檔案。靜態庫中的.a檔案的 會在靜態鏈結過程中新增到可執行檔案中,可執行檔案會變得很大。與靜態鏈結不同,linux系統的ld鏈結器會將動態庫.so檔案進行符號重定位生成可執行檔案,動態庫.so檔案並不新增到可執...

靜態鏈結 動態鏈結

如果函式庫的乙份拷貝是可執行檔案的物理組成部分,那麼我們稱之為靜態鏈結。如果可執行檔案只是包含了檔名,讓載入器在執行時能夠尋找程式所需的函式庫,那麼稱為動態鏈結。即根據函式庫是不是可執行檔案的組成部分區分靜態鏈結和動態鏈結。1 可執行檔案的體積小。2 雖然執行速度稍慢,但是能更加有效的利用磁碟空間,...

靜態鏈結 動態鏈結

所謂靜態 動態是指鏈結。回顧一下,將乙個程式編譯成可執行程式的步驟 圖 編譯過程 靜態庫之所以成為 靜態庫 是因為在鏈結階段,會將彙編生成的目標檔案.o與引用到的庫一起鏈結打包到可執行檔案中。因此對應的鏈結方式稱為靜態鏈結。試想一下,靜態庫與彙編生成的目標檔案一起鏈結為可執行檔案,那麼靜態庫必定跟....