999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

動(dòng)態(tài)鏈接庫的生成和鏈接

2011-10-21 22:33:44褚姝韞李冀東王晉
卷宗 2011年6期
關(guān)鍵詞:程序

褚姝韞 李冀東 王晉

摘要:動(dòng)態(tài)鏈接庫英文為DLL,是Dynamic Link Library 的縮寫形式,DLL是一個(gè)包含可由多個(gè)程序同時(shí)使用的代碼和數(shù)據(jù)的庫,動(dòng)態(tài)鏈接庫使進(jìn)程可以調(diào)用不屬于其可執(zhí)行代碼的函數(shù),還有助于共享數(shù)據(jù)和資源。通過使用 DLL,程序可以實(shí)現(xiàn)模塊化,由相對(duì)獨(dú)立的組件組成,可以更為容易地將更新應(yīng)用于各個(gè)模塊,而不會(huì)影響該程序的其他部分,為程序的開發(fā)帶來了很大的便利。這篇文章研究了VC下動(dòng)態(tài)鏈接庫的生成和調(diào)用。

關(guān)鍵詞:動(dòng)態(tài)鏈接庫;DLL;程序;模塊;共享數(shù)據(jù)

中圖分類號(hào):TP311.52

1 引 言

動(dòng)態(tài)鏈接庫英文為DLL,是Dynamic Link Library 的縮寫形式,DLL是一個(gè)包含可由多個(gè)程序同時(shí)使用的代碼和數(shù)據(jù)的庫,動(dòng)態(tài)鏈接庫使進(jìn)程可以調(diào)用不屬于其可執(zhí)行代碼的函數(shù),還有助于共享數(shù)據(jù)和資源。

當(dāng)程序使用DLL時(shí),具有的優(yōu)點(diǎn)如下:

(1) 使用較少的資源

當(dāng)多個(gè)程序使用同一個(gè)函數(shù)庫時(shí),DLL 可以減少在磁盤和物理內(nèi)存中加載的代碼的重復(fù)量。使前臺(tái)的程序得到良好的運(yùn)行,而且可以大大減少對(duì)其它程序的影響。

(2) 推廣模塊式體系結(jié)構(gòu)

DLL有助于促進(jìn)模塊式程序的開發(fā),這可以幫助您開發(fā)要求提供多個(gè)語言版本的大型程序或要求具有模塊式體系結(jié)構(gòu)的程序。

(3) 簡化部署和安裝

當(dāng) DLL 中的函數(shù)需要更新或修復(fù)時(shí),部署和安裝 DLL 不要求重新建立程序與該 DLL 的鏈接。此外,如果多個(gè)程序使用同一個(gè) DLL,那么多個(gè)程序都將從該更新或修復(fù)中獲益。當(dāng)您使用定期更新或修復(fù)的第三方 DLL 時(shí),會(huì)大大簡化程序的更新步驟。

DLL在程序開發(fā)中具有無可替代的作用,本文介紹了DLL的生成和鏈接。

2 動(dòng)態(tài)鏈接庫的生成和鏈接

動(dòng)態(tài)鏈接庫其實(shí)就是為應(yīng)用程序提供服務(wù)并具有某一特定功能的函數(shù)和類的集合,與它相對(duì)的是靜態(tài)鏈接庫。

靜態(tài)鏈接庫與動(dòng)態(tài)鏈接庫都是共享代碼的方式,如果采用靜態(tài)鏈接庫,則無論你愿不愿意,lib中的指令都被直接包含在最終生成的EXE文件中了。但是若使用DLL,該DLL不必被包含在最終EXE文件中,EXE文件執(zhí)行時(shí)可以“動(dòng)態(tài)”地引用和卸載這個(gè)與EXE獨(dú)立的DLL文件。靜態(tài)鏈接庫和動(dòng)態(tài)鏈接庫的另外一個(gè)區(qū)別在于靜態(tài)鏈接庫中不能再包含其他的動(dòng)態(tài)鏈接庫或者靜態(tài)庫,而在動(dòng)態(tài)鏈接庫中還可以再包含其他的動(dòng)態(tài)或靜態(tài)鏈接庫。

下面簡要的介紹一下在VC下可以生成的動(dòng)態(tài)鏈接庫的分類。

2.1 動(dòng)態(tài)鏈接庫的分類

使用VC模板可以生成以下三種不同類型的DLL:

(1)Win32DLL

只能導(dǎo)出C函數(shù)和變量,但可以使用除CObject派生的類。不能在導(dǎo)出函數(shù)中建立對(duì)話框,因?yàn)椴荒苓M(jìn)行模塊環(huán)境轉(zhuǎn)換。

(2)MFC常規(guī)DLL

只能導(dǎo)出C函數(shù)和變量,但可以使用MFC中所有的類,在使用DLL中的資源時(shí)要進(jìn)行模塊環(huán)境轉(zhuǎn)換,在每個(gè)要導(dǎo)出的函數(shù)最前面加上

AFX_MANAGE_STATE(AfxGetStaticModuleState()),也可以使用以下人工轉(zhuǎn)換:HINSTANCE hCurContext=AfxGetResourceHandle();

AfxSetResourceHandle(GetModuleHandle("temp.dll"));//可以使用DLL中的資源了。

HRSRC hRes = FindResource(hCurContext,MAKEINTRESOURCE(129),

RT_DIALOG); //可以創(chuàng)建窗口了

AfxSetResourceHandle(hCurContext);

另外標(biāo)準(zhǔn)C語言中不支持重載,因?yàn)镃語言的調(diào)用協(xié)定(__cdecl)生成的代碼中函數(shù)名只有一個(gè)_(下劃線)做前綴,所有該類型的DLL不能導(dǎo)出重載函數(shù)。

(3)MFC擴(kuò)展DLL

支持C++接口,可以導(dǎo)出C++類,成員函數(shù)及重載函數(shù),只支持動(dòng)態(tài)MFC庫。

每一個(gè)DLL必須有一個(gè)入口點(diǎn),DllMain是一個(gè)缺省的入口函數(shù)。dllMain負(fù)責(zé)初始化(Initialization)和結(jié)束(Termination)工作,每當(dāng)一個(gè)新的進(jìn)程或者該進(jìn)程的新的線程訪問DLL時(shí),或者訪問DLL的每一個(gè)進(jìn)程或者線程不再使用DLL或者結(jié)束時(shí),都會(huì)調(diào)用DllMain。但是,使用TerminateProcess或TerminateThread結(jié)束進(jìn)程或者線程,不會(huì)調(diào)用DllMain。

下面以一個(gè)簡單的小程序?yàn)槔f明動(dòng)態(tài)動(dòng)態(tài)鏈接庫的生成和鏈接。

2.2 動(dòng)態(tài)鏈接庫的生成

動(dòng)態(tài)鏈接庫的生成有兩種方法:

(1)使用導(dǎo)出函數(shù)關(guān)鍵字_declspec(dllexport)創(chuàng)建MyDll.dll,該動(dòng)態(tài)鏈接庫中有兩個(gè)函數(shù),分別用來實(shí)現(xiàn)得到兩個(gè)數(shù)的最大和最小數(shù)。

在MyDll.h添加:

extern "C" _declspec(dllexport) int Max(int a, int b);

extern "C" _declspec(dllexport) int Min(int a, int b);

在MyDLL.cpp中添加:

#include"MyDll.h"

int Max(int a, int b)

{……。。//要實(shí)現(xiàn)的功能代碼}

int Min(int a, int b)

{…………//要實(shí)現(xiàn)的功能代碼}

該動(dòng)態(tài)鏈接庫編譯成功后,打開MyDll工程中的debug目錄,可以看到MyDll.dll、MyDll.lib兩個(gè)文件。LIB文件中包含DLL文件名和DLL文件中的函數(shù)名等,該LIB文件只是對(duì)應(yīng)該DLL文件的“映像文件”,與DLL文件相比,LIB文件的長度要小的多,在進(jìn)行隱式鏈接DLL時(shí)要用到它。讀者可能已經(jīng)注意到在MyDll.h中有關(guān)鍵字"extern C",它可以使其他編程語言訪問你編寫的DLL中的函數(shù)。

(2)用.def文件創(chuàng)建工程MyDll

為了用.def文件創(chuàng)建DLL,請先刪除上個(gè)例子創(chuàng)建的工程中的MyDll.h文件,保留MyDll.cpp并在該文件頭刪除#include MyDll.h語句,同時(shí)往該工程中加入一個(gè)文本文件,命名為MyDll.def,再在該文件中加入如下代碼:

LIBRARY MyDll

EXPORTS

MaxMin

其中LIBRARY語句說明該def文件是屬于相應(yīng)DLL的,EXPORTS語句下列出要導(dǎo)出的函數(shù)名稱。我們可以在.def文件中的導(dǎo)出函數(shù)后加@n,如Max@1,Min@2,表示要導(dǎo)出的函數(shù)順序號(hào),在進(jìn)行顯式連時(shí)可以用到它。該DLL編譯成功后,打開工程中的Debug目錄,同樣也會(huì)看到MyDll.dll和MyDll.lib文件。

2.3 動(dòng)態(tài)鏈接庫的鏈接

應(yīng)用程序使用DLL可以采用兩種方式:一種是隱式鏈接,另一種是顯式鏈接。在使用DLL之前首先要知道DLL中函數(shù)的結(jié)構(gòu)信息。Visual C++6.0在VCin目錄下提供了一個(gè)名為Dumpbin.exe的小程序,用它可以查看DLL文件中的函數(shù)結(jié)構(gòu)。另外,Windows系統(tǒng)將遵循下面的搜索順序來定位DLL: ① 包含EXE文件的目錄;② 進(jìn)程的當(dāng)前工作目錄; ③ Windows系統(tǒng)目錄; ④ Windows目錄;⑤ 列在Path環(huán)境變量中的一系列目錄。

(1)隱式鏈接

隱式鏈接就是在程序開始執(zhí)行時(shí)就將DLL文件加載到應(yīng)用程序當(dāng)中。實(shí)現(xiàn)隱式鏈接很容易,只要將導(dǎo)入函數(shù)關(guān)鍵字_declspec(dllimport)函數(shù)名等寫到應(yīng)用程序相應(yīng)的頭文件中就可以了。下面的例子通過隱式鏈接調(diào)用MyDll.dll庫中的Min函數(shù)。

在創(chuàng)建DllTest.exe文件之前,要先將MyDll.dll和MyDll.lib拷貝到當(dāng)前工程所在的目錄下面,也可以拷貝到windows的System目錄下。如果DLL使用的是def文件,要?jiǎng)h除TestDll.h文件中關(guān)鍵字“extern C”。TestDll.h文件中的關(guān)鍵字Progam commit是要Visual C+的編譯器在link時(shí),鏈接到MyDll.lib文件,當(dāng)然,開發(fā)人員也可以不使用#pragma comment(lib,"MyDll.lib")語句,而直接在工程的Setting->Link頁的Object/Moduls欄填入MyDll.lib既可。

(2)顯式鏈接

顯式鏈接是應(yīng)用程序在執(zhí)行過程中隨時(shí)可以加載DLL文件,也可以隨時(shí)卸載DLL文件,這是隱式鏈接所無法作到的,所以顯式鏈接具有更好的靈活性,對(duì)于解釋性語言更為合適。不過實(shí)現(xiàn)顯式鏈接要麻煩一些。在應(yīng)用程序中用LoadLibrary或MFC提供的AfxLoadLibrary顯式的將自己所做的動(dòng)態(tài)鏈接庫調(diào)進(jìn)來,動(dòng)態(tài)鏈接庫的文件名即是上述兩個(gè)函數(shù)的參數(shù),此后再用GetProcAddress()獲取想要引入的函數(shù)。自此,你就可以象使用如同在應(yīng)用程序自定義的函數(shù)一樣來調(diào)用此引入函數(shù)了。在應(yīng)用程序退出之前,應(yīng)該用FreeLibrary或MFC提供的AfxFreeLibrary釋放動(dòng)態(tài)鏈接庫。下面是通過顯式鏈接調(diào)用DLL中的Max函數(shù)的例子。

在通過顯式鏈接調(diào)用DLL中的Max函數(shù)中使用類型定義關(guān)鍵字typedef,定義指向和DLL中相同的函數(shù)原型指針,然后通過LoadLibray()將DLL加載到當(dāng)前的應(yīng)用程序中并返回當(dāng)前DLL文件的句柄,然后通過GetProcAddress()函數(shù)獲取導(dǎo)入到應(yīng)用程序中的函數(shù)指針,函數(shù)調(diào)用完畢后,使用FreeLibrary()卸載DLL文件。在編譯程序之前,首先要將DLL文件拷貝到工程所在的目錄或Windows系統(tǒng)目錄下。

使用顯式鏈接應(yīng)用程序編譯時(shí)不需要使用相應(yīng)的Lib文件。另外,使用GetProcAddress()函數(shù)時(shí),可以利用MAKEINTRESOURCE()函數(shù)直接使用DLL中函數(shù)出現(xiàn)的順序號(hào),如將GetProcAddress(hDLL,"Min")改為GetProcAddress(hDLL, MAKEINTRESOURCE(2))(函數(shù)Min()在DLL中的順序號(hào)是2),這樣調(diào)用DLL中的函數(shù)速度很快,但是要記住函數(shù)的使用序號(hào),否則會(huì)發(fā)生錯(cuò)誤。

3 結(jié) 論

本文介紹了VC模板下動(dòng)態(tài)鏈接庫的生成和鏈接,動(dòng)態(tài)鏈接庫使進(jìn)程可以調(diào)用不屬于其可執(zhí)行代碼的函數(shù),還有助于共享數(shù)據(jù)和資源,促進(jìn)模塊化程序的開發(fā),簡化程序更新的步驟,在實(shí)際開發(fā)中要多運(yùn)用動(dòng)態(tài)鏈接庫。

參考文獻(xiàn)

[1]宋寶華. VC++動(dòng)態(tài)鏈接庫編程之基本概念[0L]. http://dev.yesky.com/228/2141728.shtml

[2]何鵬飛.WINDOWS動(dòng)態(tài)連接庫技術(shù)的探討[J].計(jì)算機(jī)應(yīng)用研究,1995,3:18-20.

猜你喜歡
程序
給Windows添加程序快速切換欄
電腦愛好者(2020年6期)2020-05-26 09:27:33
試論我國未決羈押程序的立法完善
失能的信仰——走向衰亡的民事訴訟程序
“程序猿”的生活什么樣
英國與歐盟正式啟動(dòng)“離婚”程序程序
基于VMM的程序行為異常檢測
偵查實(shí)驗(yàn)批準(zhǔn)程序初探
我國刑事速裁程序的構(gòu)建
創(chuàng)衛(wèi)暗訪程序有待改進(jìn)
恐怖犯罪刑事訴訟程序的完善
主站蜘蛛池模板: 精品国产乱码久久久久久一区二区| 五月婷婷精品| 国产人免费人成免费视频| 国产福利免费视频| 国产高清在线观看91精品| 蜜臀AVWWW国产天堂| 亚洲无码高清视频在线观看 | 嫩草在线视频| 国产精品永久不卡免费视频| 国产人成在线视频| 91午夜福利在线观看精品| 99re免费视频| 国产精品久久自在自2021| 成人一级黄色毛片| 日韩精品高清自在线| 中文字幕1区2区| 中国一级毛片免费观看| 日韩美毛片| 天堂亚洲网| 精品久久久久成人码免费动漫| 第一页亚洲| 欧美影院久久| 91最新精品视频发布页| 日韩无码精品人妻| 亚洲va在线∨a天堂va欧美va| 日韩中文精品亚洲第三区| 天天色综网| 成人欧美在线观看| 四虎成人在线视频| 亚洲91精品视频| 亚洲中文字幕无码mv| 72种姿势欧美久久久大黄蕉| 91免费国产高清观看| 午夜毛片免费看| 老熟妇喷水一区二区三区| 久久青草热| 日韩欧美网址| 亚洲 欧美 中文 AⅤ在线视频| 国产精品区视频中文字幕| 久久久久国产一级毛片高清板| 日韩在线网址| 中文字幕久久亚洲一区 | 亚洲第一在线播放| AV在线天堂进入| 黄色三级网站免费| 欧美日韩专区| 制服丝袜亚洲| 91午夜福利在线观看| 人人澡人人爽欧美一区| 免费看a级毛片| 婷婷激情五月网| 免费av一区二区三区在线| 视频一本大道香蕉久在线播放| 538国产视频| 97国产精品视频人人做人人爱| 欧美成人精品高清在线下载| 国产精品白浆无码流出在线看| 99热这里只有精品免费国产| 中文字幕亚洲专区第19页| 熟妇丰满人妻av无码区| 亚洲国产成人自拍| 成人韩免费网站| 亚洲人成网站日本片| 2022国产无码在线| 巨熟乳波霸若妻中文观看免费| 欧美自拍另类欧美综合图区| 久久国产精品电影| 国产精品亚洲一区二区在线观看| 亚洲第一色视频| 91免费国产高清观看| 一本综合久久| 青青操国产| 国产aaaaa一级毛片| 日本一区二区三区精品视频| 国产亚洲精品精品精品| 日韩毛片免费| 国产女人爽到高潮的免费视频 | 亚洲国产天堂久久综合226114| 草逼视频国产| 婷婷色中文网| 亚洲中文字幕在线观看| 亚洲天堂网站在线|