国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Windows系統(tǒng)下的動(dòng)態(tài)鏈接庫淺談

Windows系統(tǒng)下的動(dòng)態(tài)鏈接庫淺談





                                                                                               Windows系統(tǒng)下的動(dòng)態(tài)鏈接庫淺談
                                                                                                                                                曾宇知
                                                                                                                            西南科技大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院計(jì)科0502班 學(xué)號(hào):20051447
摘要:
動(dòng)態(tài)鏈接庫(DLL,即Dynamic-Link-Library)是可執(zhí)行的模塊,是Windows的一種極其重要的技術(shù)。它使得開發(fā)人員可以通過編寫動(dòng)態(tài)鏈接庫,方便靈活的實(shí)現(xiàn)大型程序的開發(fā),按自己的意愿對(duì)操作系統(tǒng)進(jìn)行擴(kuò)展。API是Application Programming Interface 應(yīng)用程序編寫接口的縮寫,極大意義上方便了用戶在某一平臺(tái)下的編程。
關(guān)鍵字:動(dòng)態(tài)鏈接,DLL,API
動(dòng)態(tài)鏈接庫是操作系統(tǒng)中的一種極其重要的技術(shù)。它使得開發(fā)人員可以通過編寫動(dòng)態(tài)鏈接庫,方便靈活的實(shí)現(xiàn)大型程序的開發(fā),按自己的意愿對(duì)操作系統(tǒng)進(jìn)行擴(kuò)展。API是Application Programming Interface 應(yīng)用程序編寫接口的縮寫,極大意義上方便了用戶在某一平臺(tái)下的編程。(本論文以Windows平臺(tái)為基準(zhǔn)展開討論。)
動(dòng)態(tài)鏈接庫是可執(zhí)行的模塊,但它沒有自己的堆棧,必須在調(diào)用動(dòng)態(tài)鏈接庫函數(shù)的程序環(huán)境下運(yùn)行。動(dòng)態(tài)鏈接庫不僅可以作為一個(gè)運(yùn)行模塊,包括函數(shù)代碼,而且可以包含程序以外的任何數(shù)據(jù)或資源(位圖、圖標(biāo)等等)。動(dòng)態(tài)鏈接庫就是給應(yīng)用程序提供函數(shù)或者資源。
動(dòng)態(tài)鏈接與靜態(tài)鏈接是相對(duì)立的。靜態(tài)鏈接的時(shí)候,可執(zhí)行程序內(nèi)包含了所訪問的函數(shù)的代碼,可執(zhí)行程序占用的空間較大;但運(yùn)行時(shí),不需要其他模塊支持,從而速度相對(duì)較快。動(dòng)態(tài)鏈接的可執(zhí)行程序中不包含動(dòng)態(tài)訪問的函數(shù)代碼,僅僅包含對(duì)它的參考,運(yùn)行時(shí)需要其他模塊(DLL)的支持,速度相對(duì)較慢。
它也可以看作是一個(gè)可以被其它應(yīng)用程序共享的程序模塊,其中封裝了一些可以被共享的例程和資源。動(dòng)態(tài)鏈接庫文件的擴(kuò)展名一般是dll, 也有可能是drv、sys和fon,它和可執(zhí)行文件(exe)非常類似,區(qū)別在于DLL中雖然包含了可執(zhí)行代碼卻不能單獨(dú)執(zhí)行,而應(yīng)由Windows應(yīng)用 程序直接或間接調(diào)用。
動(dòng)態(tài)鏈接是相對(duì)于靜態(tài)鏈接而言的。所謂靜態(tài)鏈接是指把要調(diào)用的函數(shù)或者過程鏈接到可執(zhí)行文件中,成為可執(zhí)行文件 的一部分。換句話說,函數(shù)和過程的代碼就在程序的exe文件中,該文件包含了運(yùn)行時(shí)所需的全部代碼。當(dāng)多個(gè)程序都調(diào)用相同函數(shù)時(shí),內(nèi)存中就會(huì)存在這個(gè)函數(shù) 的多個(gè)拷貝,這樣就浪費(fèi)了寶貴的內(nèi)存資源。而動(dòng)態(tài)鏈接所調(diào)用的函數(shù)代碼并沒有被拷貝到應(yīng)用程序的可執(zhí)行文件中去,而是僅僅在其中加入了所調(diào)用函數(shù)的描述信 息(往往是一些重定位信息)。僅當(dāng)應(yīng)用程序被裝入內(nèi)存開始運(yùn)行時(shí),在Windows的管理下,才在應(yīng)用程序與相應(yīng)的DLL之間建立鏈接關(guān)系。當(dāng)要執(zhí)行所調(diào) 用DLL中的函數(shù)時(shí),根據(jù)鏈接產(chǎn)生的重定位信息,Windows才轉(zhuǎn)去執(zhí)行DLL中相應(yīng)的函數(shù)代碼。
一般情況下,如果一個(gè)應(yīng)用程序使 用了動(dòng)態(tài)鏈接庫,Win32系統(tǒng)保證內(nèi)存中只有DLL的一份復(fù)制品,這是通過內(nèi)存映射文件實(shí)現(xiàn)的。DLL首先被調(diào)入Win32系統(tǒng)的全局堆棧,然后映射到 調(diào)用這個(gè)DLL的進(jìn)程地址空間。在Win32系統(tǒng)中,每個(gè)進(jìn)程擁有自己的32位線性地址空間,如果一個(gè)DLL被多個(gè)進(jìn)程調(diào)用,每個(gè)進(jìn)程都會(huì)收到該DLL的 一份映像。與16位Windows不同,在Win32中DLL可以看作是每個(gè)進(jìn)程自己的代碼
下面我們可以通過一具體的例子來進(jìn)一部認(rèn)清動(dòng)態(tài)鏈接庫。作者實(shí)驗(yàn)平臺(tái):Windows XP+sp2/Visual C++ 6.0
下面通過例子介紹如何在動(dòng)態(tài)鏈接庫中定義函數(shù)、資源、和類以及如何在工程中使用動(dòng)態(tài)鏈接庫中已定義的函數(shù)、資源、類。
函數(shù)的定義和使用方法:
第一步:
運(yùn)行AppWizard,定義項(xiàng)目名為mydll,選擇MFC AppWizard(dll),而不是MFC AppWizards(exe)。
第二步:
在這個(gè)例子中,只有一個(gè)AppWizard屏幕出現(xiàn),選擇MFC擴(kuò)展DLL(MFC Extension DLL (using shared MFC DLL),點(diǎn)擊FINISH生成工程。
第三步:
點(diǎn)擊File中的New,選擇C/C++ Header File,F(xiàn)ile Name中輸入dll,點(diǎn)擊OK,創(chuàng)建dll.h。輸入extern "C" __declspec(dllexport) int fun(int x1,int x2,int x3); ,保存。
第四步:
點(diǎn)擊File中的New,選擇C++ Source File,F(xiàn)ile Name中輸入dll,點(diǎn)擊OK,創(chuàng)建dll.cpp。輸入

#include "stdafx.h"
#include "dll.h"
extern "C" __declspec(dllexport) int fun(int x1,int x2,int x3)
{
return x1+x2+x3;
}
編譯生成mydll.dll和mydll.lib。
第五步:
選擇Project 中Add To Project 中的New , 重新生成一個(gè)工程,選擇MFC AppWizards(exe),項(xiàng)目名為mydlltest , 選擇Single Document ,點(diǎn)擊FINISH,生成一個(gè)新的工程。選擇菜單中的Project àSet Active Project àmydlltest ,將mydlltest設(shè)為當(dāng)前活動(dòng)工程。
第六步:
拷貝...\mydll\debug\mydll.dll 到 ..\mydlltest\debug\下,拷貝...\mydll\debug\mydll.lib到...\mydlltest\目錄下。
第七步:
在mydlltestView.cpp中的#endif下添加
extern "C" __declspec(dllimport) int fun(int x1,int x2,int x3);
在void CMydlltestView::OnDraw(CDC* pDC)中添加代碼如下:
void CMydlltestView::OnDraw(CDC* pDC)
{
CMydlltestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
int x=fun(1,2,3);
CString str;
str.Format("%d",str);
pDC->TextOut(10,10,x);
}
第八步:
在WorkSpace中的mydlltest files上點(diǎn)擊右鍵,選擇Add files to Project ,將mydll.dll添加到工程。好了,我們的工作做完了,運(yùn)行一下看看吧!
二、 類的添加和使用步驟:
在mydll中生成一個(gè)新類,類的聲明處改為class AFX_EXT_CLASS CMyClass ,在此類中和其他類一樣添加自己需要的變量和函數(shù),編譯生成新的dll和lib,重復(fù)上面的第六步,在mydlltest中利用上面的方法生成一個(gè)myclass.h文件,拷貝mydll中myclass.h的所有代碼到新生成的myclass.h中。在需要使用dll中CmyClass類的文件中包含myclass.h,然后我們就可以向其他類一樣使用該類了。三、 字符串的定義和使用:
在mydll中定義字符串資源,編譯生成新的dll和lib,重復(fù)上面的第六步,在mydlltest中的myclass.h中添加 #define IDS_MYSTR 1(假設(shè)我們定義的字符串資源的ID號(hào)為IDS_MYSTR),在需要是要該字符串的地方添加#include "myclass.h",即可使用該字符串了。
CString str2;
str2.LoadString(IDS_MYSTR);
四、 對(duì)話框的定義和使用
在mydll中定義對(duì)話框資源,生成一個(gè)新類CDlg,類的聲明處改為class AFX_EXT_CLASS CDlg : public CDialog ,像其他對(duì)話框一樣定義對(duì)話框的屬性和功能,編譯生成新的dll和lib,重復(fù)上面的第六步,在mydlltest中利用上面的方法生成一個(gè)dlg.h文件,拷貝mydll中dlg.h的所有代碼到新生成的dlg.h中。在需要使用dll中此對(duì)話框資源的文件中包含dlg.h,然后我們就可以向其他對(duì)話框一樣使用此對(duì)話框了。
CDlg dlg;
dlg.DoModal();
好了,到這里我們所有的功能就都實(shí)現(xiàn)了。
最后再談?wù)凙PI。(Advanced Programmers Interface)高級(jí)程序員接口)是一套用來控制Windows的各個(gè)部件(從桌面的外觀到位一個(gè)新進(jìn)程分配的內(nèi)存)的外觀和行為的一套預(yù)先定義的Windows函數(shù).用戶的每個(gè)動(dòng)作都會(huì)引發(fā)一個(gè)或幾個(gè)函數(shù)的運(yùn)行以Windows告訴發(fā)生了什么。
這在某種程度上很象Windows的天然代碼.其他的語言只是提供一種能自動(dòng)而且更容易的訪問API的方法.VC在這方面作了很多工作.它完全隱藏了API并且提供了在Windows環(huán)境下編程的一種完全不同的方法。
這也就是說,你用VC寫出的每行代碼都會(huì)被VC轉(zhuǎn)換為API函數(shù)傳遞給Windows.例如,Form1.Print...VC 將會(huì)以一定的參數(shù)(你的代碼中提供的,或是默認(rèn)參數(shù))調(diào)用TextOut 這個(gè)API函數(shù)。
通過動(dòng)態(tài)鏈接庫和API函數(shù),Windows這個(gè)操作系統(tǒng)以生動(dòng)的圖形化界面呈現(xiàn)在了千千萬萬用戶面前。給今后的編程和系統(tǒng)擴(kuò)展提供了廣泛而又簡易的空間。
參考文獻(xiàn):
《Programming Windows ,Fifth Edition》Charles Petzold
《Windows API》Microsoft Library Platform SDK
《Windows MSDN》Microsoft Library Platform
VC中的動(dòng)態(tài)鏈接庫應(yīng)用-科技論文網(wǎng)
電腦技術(shù)》 - windows動(dòng)態(tài)鏈接庫應(yīng)用
經(jīng)典教程:深入學(xué)習(xí)Windows動(dòng)態(tài)鏈接庫 - 21CN.COM
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Windows 動(dòng)態(tài)鏈接庫DLL
例程詳析動(dòng)態(tài)鏈接庫
C/C++語言編程系列008----手把手教你創(chuàng)建及調(diào)試動(dòng)態(tài)庫DLL程序
利用VC調(diào)用動(dòng)態(tài)鏈接庫中的函數(shù)
Windows API 教程(六) 動(dòng)態(tài)鏈接庫
使用VS2008創(chuàng)建和調(diào)用動(dòng)態(tài)鏈接庫
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服