




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第20章
動(dòng)態(tài)鏈接庫與鉤子
對(duì)于Windows應(yīng)用程序向言,創(chuàng)建一個(gè)沒有使用DLL的應(yīng)用程序幾乎是不可能的,前面使用的所有API函數(shù)都是從系統(tǒng)動(dòng)態(tài)鏈接庫導(dǎo)出的。實(shí)際上,Windows提供給編程人員的幾乎所有功能都駐留在動(dòng)態(tài)鏈接庫中。Windows鉤子廣泛應(yīng)用于各種偵測程序中,如輸入監(jiān)視、API截獲等。一般鉤子必須寫在動(dòng)態(tài)鏈接庫中,以便提供了其他程序使用。了解動(dòng)態(tài)鏈接庫的運(yùn)行機(jī)制在DLL中導(dǎo)出函數(shù)函數(shù)的調(diào)用約定DLL的調(diào)用方式在DLL中導(dǎo)出變量在DLL中導(dǎo)出類MFC規(guī)則DLLMFC擴(kuò)展DLLWindows鉤子的應(yīng)用
20.1了解DLL
DLL實(shí)際上指的就是動(dòng)態(tài)鏈接庫。大部分動(dòng)態(tài)鏈接庫是以擴(kuò)展名為dll的文件形式存在的,但并不是只有dll擴(kuò)展名的文件才是動(dòng)態(tài)鏈接庫,系統(tǒng)中的某些exe文件、字體文件(*.fon)、驅(qū)動(dòng)程序(*.drv)和各種控件(*.ocx)等都是動(dòng)態(tài)鏈接庫。實(shí)際上,系統(tǒng)中大部分包含公用代碼的模塊都有可能是動(dòng)態(tài)鏈接庫。需要注意,動(dòng)態(tài)鏈接庫不能自己執(zhí)行,它必須被映射到其他應(yīng)用程序的地址空間中才能執(zhí)行。當(dāng)動(dòng)態(tài)鏈接庫可被是映射到應(yīng)用程序內(nèi)存后,它可以使用應(yīng)用程序的資源,它所擁有的資源也可以被應(yīng)用程序使用,它的任何操作都是代表應(yīng)用程序進(jìn)行的,當(dāng)動(dòng)態(tài)鏈接庫進(jìn)行打開文件、分配內(nèi)存和創(chuàng)建窗口等操作后,這些文件、內(nèi)存和窗口都是應(yīng)用程序所擁有的。
20.2靜態(tài)鏈接庫
靜態(tài)鏈接庫的使用方法:首先將靜態(tài)連接庫的頭文件.h和庫.lib放到自己項(xiàng)目目錄下;然后在stdafx.h頭文件中包含靜態(tài)庫及其頭文件:#include"xxx.h"#pragmacomment(lib,"xxx.lib")這樣編譯器在編譯時(shí)就會(huì)將庫文件中的函數(shù)導(dǎo)入到程序中。
20.3常規(guī)DLL
常規(guī)DLL有優(yōu)點(diǎn)有以下幾方面:客戶程序不必是一個(gè)MFC應(yīng)用程序。它只需要能調(diào)用C函數(shù)即可,即可以是MFC應(yīng)用程序,也可以是Delphi或VisualBasic應(yīng)用程序。在常規(guī)DLL的內(nèi)部可以使用C++類,然后只導(dǎo)出C函數(shù)的包裝器。這樣,對(duì)內(nèi)部的C++類的任何修改都不會(huì)影響到調(diào)用它的應(yīng)用程序或DLL。
20.3.1聲明導(dǎo)出函數(shù)
在DLL中導(dǎo)出函數(shù)的聲明有兩種方式:一種是在函數(shù)聲明中添加__declspec(dllexport)修飾符;另外一種方式是采用模塊定義.def文件聲明,模塊定義文件.def文件為鏈接器提供了有關(guān)被鏈接程序的導(dǎo)出、屬性及其他方面的信息。20.3.2DLL的調(diào)用方式
在前面的示例使用LoadLibrary()、GetProcAddress()和FreeLibrary()三個(gè)API函數(shù)調(diào)用DLL,它們分別實(shí)現(xiàn)了DLL加載、DLL函數(shù)地址獲取、DLL釋放,這種調(diào)用方式被稱為DLL的動(dòng)態(tài)調(diào)用。動(dòng)態(tài)調(diào)用的特點(diǎn)是編程人員完全用API函數(shù)加載和卸載DLL,這樣可以決定DLL文件何時(shí)加載或不加載。與動(dòng)態(tài)調(diào)用方式相對(duì)應(yīng)的就是靜態(tài)調(diào)用方式。靜態(tài)調(diào)用方式的特點(diǎn)是由編譯器完成對(duì)DLL的加載和卸載。靜態(tài)調(diào)用方式相對(duì)簡單實(shí)用,但不如動(dòng)態(tài)調(diào)用方式靈活。
20.3.3調(diào)用約定與名稱改編
調(diào)用約定用來處理決定函數(shù)參數(shù)傳送時(shí)入棧和出棧的順序,以及編譯器用來識(shí)別函數(shù)名稱的名稱修飾約定等問題。在C++中,為了允許操作符重載和函數(shù)重載,C++編譯器往往按照某種規(guī)則改寫函數(shù)名,這項(xiàng)技術(shù)通常被稱為名稱改編,而C語言編譯器在編譯時(shí)則不會(huì)進(jìn)行名字改編。所以,當(dāng)C++調(diào)用C語言生成的函數(shù)或函數(shù)庫時(shí)鏈接器會(huì)無法正確的鏈接相應(yīng)的函數(shù),同樣,C調(diào)用C++生成的函數(shù)庫時(shí)鏈接器也無法解析相應(yīng)的函數(shù)。為了解決這個(gè)問題,C++提供了修飾符extern"C"來解決這個(gè)問題。為導(dǎo)出函數(shù)添加該修飾符后,編譯器在編譯時(shí)將按照C的方式去處理,不進(jìn)行名稱改編。另外,為了使其它語言編寫的模塊,如VisualBasic應(yīng)用程序或Pascal應(yīng)用程序等都可以調(diào)用C/C++編寫的DLL的函數(shù),必須使用正確的調(diào)用約定來導(dǎo)出函數(shù),并且不讓編譯器對(duì)要導(dǎo)出的函數(shù)進(jìn)行任何名稱改編。VisualC++中。C/C++默認(rèn)的調(diào)用方式為__cdecl,而標(biāo)準(zhǔn)調(diào)用約定是_stdcall,WINAPI都采用這種方式。在調(diào)用約定改變時(shí),名稱改編也不一致。當(dāng)使用C編譯方式(函數(shù)聲明為extern"C")時(shí),如果用_cdecl調(diào)用約定編譯,則不會(huì)進(jìn)行名字改編,但是如果用_stdcall調(diào)用約定時(shí),則會(huì)發(fā)生名稱改編,這樣,其他用_stdcall調(diào)用約定的編譯器就無法調(diào)用該函數(shù)。
20.3.4導(dǎo)出類組合框?qū)涡芯庉嬁蚝土斜砜蚪M合為一體。組合框有三種類型:簡單型、下拉型和下拉列表型。在這三種類型中,簡單型組合框最小使用,其列表部分總會(huì)被顯示。用戶從列表中選中一個(gè)項(xiàng)目時(shí),該項(xiàng)目會(huì)自動(dòng)復(fù)制到編輯框部分。用戶也可以直接在編輯框部分輸入文本。如果用戶輸入的文本與列表中某項(xiàng)目匹配,該項(xiàng)目將被自動(dòng)加亮顯示并滾動(dòng)到可見的地方。下拉型組合框與簡單型組合框的不同之處在于它的列表只有被要求時(shí)才顯示。下拉列表型組合框的工作方式與下拉型組合框相同,但它不允許在編輯部分輸入文本,只允許用戶在列表中選擇項(xiàng)目。
20.4MFC規(guī)則DLL
MFC規(guī)則DLL能夠被所有支持DLL技術(shù)的語言所編寫的應(yīng)用程序調(diào)用,當(dāng)然也包括使用MFC的應(yīng)用程序。MFC規(guī)則DLL包含兩個(gè)方面:在該DLL的內(nèi)部可以使用MFC類庫;另外,為了使其他非MFC程序能調(diào)用DLL,所以它的導(dǎo)出接口不能使用MFC類。根據(jù)規(guī)則DLL使用MFCDLL的不同,規(guī)則DLL可以分為兩類:共享MFCDLL的規(guī)則DLL和靜態(tài)鏈接MFCDLL的規(guī)則DLL。
20.4.1靜態(tài)鏈接MFCDLL的規(guī)則DLL
對(duì)于靜態(tài)鏈接MFCDLL的規(guī)則DLL而言,在編譯時(shí)會(huì)將MFC庫中的代碼直接生成在DLL文件中。當(dāng)應(yīng)用程序調(diào)用這種DLL時(shí),所使用的MFC資源是互相獨(dú)立。
20.4.2共享MFCDLL的規(guī)則DLL
對(duì)于共享MFCDLL的規(guī)則DLL而言,在編譯時(shí)并沒有將MFCDLL中的代碼添加到DLL中,在應(yīng)用程序調(diào)用這種DLL時(shí),它們將共享MFCDLL。在Windows系統(tǒng)中,它使用實(shí)例句柄HINSTANCE標(biāo)識(shí)應(yīng)用程序進(jìn)程及其調(diào)用的DLL模塊。在使用了MFC共享庫時(shí),默認(rèn)情況下,MFC將使用應(yīng)用程序進(jìn)程的HINSTANCE句柄加載資源。當(dāng)DLL和應(yīng)用程序都有自己的資源,并且這些資源可能有相同的ID標(biāo)識(shí)時(shí),這時(shí)應(yīng)用程序就需要通過資源模塊的切換來找到正確的資源。如果應(yīng)用程序需要來自于DLL的資源,就應(yīng)將資源模塊句柄指定為DLL的模塊句柄;如果需要應(yīng)用程序中包含的資源,就應(yīng)將資源模塊句柄指定為應(yīng)用程序的模塊句柄。
20.5MFC擴(kuò)展DLL
常規(guī)DLL和MFC規(guī)則DLL主要用于非MFC客戶程序,而MFC擴(kuò)展DLL用于導(dǎo)出增強(qiáng)MFC的函數(shù)和類,它的客戶應(yīng)用程序必須是MFC應(yīng)用程序。
20.6Windows鉤子
Windows系統(tǒng)是建立在事件驅(qū)動(dòng)機(jī)制之上的,系統(tǒng)各部分之間的通信也都是通過消息的相互傳遞而實(shí)現(xiàn)的。在通常情況下,應(yīng)用程序只能處理來自它內(nèi)部的消息,或者是從其他進(jìn)程發(fā)過來的消息,如果需要對(duì)進(jìn)程外傳遞的消息進(jìn)行攔截處理,就必須采取一種被稱為HOOK(鉤子)的技術(shù)。
20.6.1認(rèn)識(shí)HOOK鉤子
鉤子的本質(zhì)是一段用于處理系統(tǒng)消息的程序,通過“鉤掛”可以給Windows設(shè)置一個(gè)處理或過濾事件的回調(diào)函數(shù),該函數(shù)也叫做“鉤子函數(shù)”,每當(dāng)感興趣的事件發(fā)生時(shí),Windows都將調(diào)用該函數(shù)。根據(jù)在使用鉤子時(shí)可以根據(jù)其監(jiān)視范圍的不同,HOOK鉤子分為兩種類型:局部鉤子和全局鉤子。局部鉤子僅鉤掛自己進(jìn)程的事件,而全局鉤子將捕捉系統(tǒng)中所有進(jìn)程將發(fā)生的事件消息。需要注意,安裝鉤子函數(shù)將會(huì)影響系統(tǒng)的性能,特別是監(jiān)測“系統(tǒng)范圍事件”的全局鉤
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 急性附睪炎患者的護(hù)理
- 開發(fā)項(xiàng)目股權(quán)質(zhì)押合同
- 建筑防水責(zé)任合同
- 商標(biāo)合作開發(fā)合同(2篇)
- 工作地點(diǎn)變更合同
- 2025年統(tǒng)編版小學(xué)道德與法治三年級(jí)下冊《生活離不開規(guī)則》說課課件
- 臨時(shí)搬家工人合同
- 伊利公司供應(yīng)鏈管理
- 如何把書做成課件
- 中國教育夢培訓(xùn)
- 2025-2030中國集裝箱化和模塊化數(shù)據(jù)中心行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略分析研究報(bào)告
- 2025-2030中國防腐新材料行業(yè)市場深度調(diào)研及發(fā)展策略與投資前景預(yù)測研究報(bào)告
- 2025年護(hù)工考試試題及答案
- 2025屆成都市2022級(jí)高中畢業(yè)班第二次診斷性檢測語文試題及答案
- 2025屆北京市第四中學(xué)順義分校高三零模英語試題(原卷版+解析版)
- 全國第9個(gè)近視防控月活動(dòng)總結(jié)
- 智能傳感器研發(fā)-第1篇-深度研究
- 2025至2030年中國快速換模系統(tǒng)數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025年舉辦科普月的活動(dòng)總結(jié)(3篇)
- 2025年高三語文上學(xué)期期末考試作文題目解析及范文:關(guān)于鴻溝的思考
- 2025年春新人教版化學(xué)九年級(jí)下冊課件 第十一單元 化學(xué)與社會(huì) 課題1 化學(xué)與人體健康
評(píng)論
0/150
提交評(píng)論