熱區(qū)技術中的動態(tài)鏈接庫應用_第1頁
熱區(qū)技術中的動態(tài)鏈接庫應用_第2頁
熱區(qū)技術中的動態(tài)鏈接庫應用_第3頁
熱區(qū)技術中的動態(tài)鏈接庫應用_第4頁
熱區(qū)技術中的動態(tài)鏈接庫應用_第5頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、熱區(qū)技術中的動態(tài)鏈接庫應用摘要:動態(tài)鏈接庫,簡稱DLL,英文全稱“DynamicLinkLibrary”c動態(tài)鏈接是相對于靜態(tài)鏈接而言的。動態(tài)連接庫是一個可以同時被多個程序使用的代碼和數(shù)據(jù)的庫,也可以理解為是一個可以被其它應用程序共享的程序模塊。分析了熱區(qū)技術中的動態(tài)鏈接庫的應用。關鍵詞:熱區(qū);動態(tài)連接庫;隱式調用;顯示調用;DLL0引言隨著計算機的快速發(fā)展,計算機的應用日益廣泛,計算機軟件的開發(fā)越來越重要,各種應用軟件越來越多。在Windows平臺下同時打開多個可視化程序會導致Windows桌面的復雜化。為了簡化屏幕,在一些應用軟件中,都具有熱區(qū)的功能。例如我們比較熟悉的QQ,當把QQ拖到屏

2、幕的某一區(qū)域時,QQ自動隱藏;當把鼠標移回到某一區(qū)域時QQ可以自動彈出。一般我們把這種可以自動隱藏和彈出程序的區(qū)域稱為熱區(qū)。動態(tài)連接庫是一個極其重要的技術,它可以使開發(fā)人員通過編寫動態(tài)鏈接庫,方便靈活地實現(xiàn)大型程序的開發(fā)。本文介紹了在C+Builder6.0平臺下實現(xiàn)熱區(qū)的過程中,通過編寫動態(tài)鏈接庫的方法,介紹了動態(tài)連接庫的應用。1動態(tài)鏈接庫動態(tài)鏈接是與靜態(tài)連接相對的。動態(tài)鏈接庫(DLL)在物理上是一些獨立的可執(zhí)行代碼的集合,同時也可以存放各種資源。雖然動態(tài)鏈接庫中存放可執(zhí)行代碼,但本身是不能運行的,只有被其它應用程序在運行時加載后,裝入到應用程序占用內存的代碼段,由應用程序調用動態(tài)鏈接庫的代

3、碼,如圖1所示。一般來說,DLL是一種磁盤文件,以.DLL、.DRV、.FON.SYS和許多以.EXE為擴展名的系統(tǒng)文件都可以是DLL。如果與其它DLL之間沒有沖突,該文件通常映射到進程虛擬空間的同一地址上。DLL模塊中包含各種導出函數(shù),用于向外界提供服務。DLL可以有自己的數(shù)據(jù)段,但沒有自己的堆棧,使用與調用它的應用程序相同的堆棧模式。一個DLL在內存中只有一個實例;DLL實現(xiàn)了代碼封裝性。DLL的編制與具體的編程語言及編譯器無關。在Windows操作系統(tǒng)中,DLL對于程序執(zhí)行是非常的重要。DLL不是一個可運行的程序,只能編譯,生成DLL系統(tǒng)文件,然后加載到應用程序中。當刪除程序的時候,沒有

4、用的DLL文件也應該刪除,不然隨著安裝程序的越來越多,DLL文件也會越來越多,久而久之就會造成系統(tǒng)的負擔。動態(tài)鏈接庫代碼在運行時間加載的特性很重要。一個大型程序如果不使用動態(tài)鏈接庫,那么當這個程序的某一個功能需要升級或改進,必須寫一些源代碼,然后將整個程序編譯,連接形成一個新的可執(zhí)行文件,最終給客戶重新安裝使用。這個過程需要花費很長時間,哪怕只是給這個大型程序多寫一行代碼。可是,如果采用大量動態(tài)鏈接庫構建整個應用程序,那么只需要改寫需要升級的動態(tài)鏈接庫的源代碼,重新編譯連接后,發(fā)送給客戶,客戶所做的僅僅是覆蓋原來的動態(tài)鏈接庫即可,不需要重新安裝整個應用程序。使用動態(tài)鏈接庫構建整個應用程序是模塊

5、化設計程序的一個重要特點。2動態(tài)鏈接庫的使用方式其它應用程序需要使用DLL時,需要調用DLL文件,有兩種調用方式:靜態(tài)調用方式和動態(tài)調用方式。2.1靜態(tài)調用方式也稱為隱式調用方式。需要應用程序運行前,將伴隨DLL文件發(fā)布的lib文件添加到工程中,并且使用DLL的文件中inelude伴隨DLL文件發(fā)布的h文件。然后就可以像調用一般函數(shù)一樣調用DLL的導出函數(shù)。2.2動態(tài)調用方式也稱為顯示調用方式。指在應用程序中運用LoadLibrary函數(shù),DLL文件能被顯式地映射到進程的地址空間。動態(tài)調用方式的優(yōu)點是在客戶程序使用動態(tài)鏈接庫的時候不需要包括含有導出函數(shù)聲明的頭文件,也不需要導入動態(tài)鏈接庫生成的

6、類型庫(一組LIB文件)。動態(tài)鏈接庫的創(chuàng)建很多開發(fā)工具有專門的向導(比如C+Builder)。這里需要主要的是在應用程序退出之前,應該用FreeLibrary釋放動態(tài)連接庫。3熱區(qū)動態(tài)鏈接庫的建立和用法在C+builder6.0集成開發(fā)環(huán)境中,建立一個From1,設置為熱區(qū)。通過菜單File|New|Other打開一個NewItems對話框,選擇New中的DLLWizard。生成DLL的主單元文件。將會看到有如下的代碼:#inelude#inelude#pragmahdrstop#pragmaargsusedintWINAPIDllEntryPoint(HINSTANCEhinst,unsig

7、nedlongreason,void*lpReserved)return1;這里DllEntryPoint()是DLL的入口函數(shù),它將在DLL加載和卸載時被調用,調用的具體情況取決于參數(shù)reasor。hinst是DLL自身的句柄。lpReserved用來說明進一步的參數(shù)。下面在DLL庫中加入代碼以實現(xiàn)熱區(qū)的功能,加入代碼如下:#definemHookWM_USER+1000/自己定義的消息HINSTANCEhinst=NULL;/DLL的句柄HHOOKhHook二NULL;/Hook的句柄externCvoid_export_stdcallInstallHook();II鼠標鉤子安裝且提供為外

8、部接口void_export_stdcallUnInstallHook();鼠標鉤子解除且提供為外部接口LRESULTCALLBACKMouseProc(intnCode,WPARAMwParam,LPARAMlParam)/回調函數(shù)/對鼠標的坐標進行判斷并返回;HWNDhWnd=FindWindow(NULL,熱區(qū));MOUSEHOOKSTRUCT*mhStruct=(MOUSEHOOKSTRUCT*)lParam;PostMessage(hWnd,mHook,mhStruct-pt.x,mhStruct-pt.y);returnCallNextHookEx(hHook,nCode,wPar

9、am,lParam);找到使用DLL的窗體函數(shù),返回需要的參數(shù)。void_stdcallInstallHook()if(!hHook)hHook=SetWindowsHookEx(WH_MOUSE,(HOOKPROC)MouseProc,hInst,0);void_stdcallUnInstallHook()if(hHook)UnhookWindowsHookEx(hHook);intWINAPIDllEntryPoint(HINSTANCEhinst,unsignedlongreason,void*lpReserved)hInst二hinst;/DLL自身的句柄return1;這樣可以很容易

10、的實現(xiàn)熱區(qū)所需要的返回參數(shù)值。還可以實現(xiàn)代碼的封閉性。特別是像一些語言類的軟件,可以分別將各種語言獨立寫在DLL中。以供獨立使用。在升級時,可以分別獨立的對庫升級。編譯生成動態(tài)鏈接庫。這樣加載到應用程序后就可以實現(xiàn)想要的功能。當入口點函數(shù)返回FALSE值時,如果使用的是加載時動態(tài)鏈接,則應用程序不啟動。如果使用的是運行時動態(tài)鏈接,則只有個別DLL不會加載。在Form1頭文件.h中做聲明,聲明為public。聲明如下:void_fastcallWndProc(Messages:TMessage&Message);boolflag;然后在Froml的*cpp文件中編寫實現(xiàn)熱區(qū)功能的函數(shù),用隱式調用

11、的方式進行處理。#definemHookWM_USER+1000externCvoid_stdcallInstallHook();/外部DLL安裝鼠標鉤子函數(shù)void_stdcallUnInstallHook();/外部DLL解除鼠標鉤子函數(shù)void_fastcallTForm1:FormCreate(TObject*Sender)flag二false;Caption二熱區(qū);/設置windows名稱InstallHook();/安裝鼠標鉤子void_fastcallTForm1:FormClose(TObject*Sender,TCloseAction&Action)UnInstallHook

12、();/解除鼠標鉤子編寫功能函數(shù),確定熱區(qū)的區(qū)域范圍。添加控件Label1用來顯示鼠標屏幕坐標、Label2用來顯示Form的最大坐標值。void_fastcallTfrmMain:WndProc(Messages:TMessage&Message)intx,y;staticintxRange,yRange;if(Message.Msg=mHook)x=Message.WParam;mhStruct-pt.x,y=Message.LParam;mhStruct-pt.yif(flag&(xxRange|yyRange|xVisible二false;if(x=Left&x=xRange&yVis

13、ible=true;Label1-Caption=AnsiString(Message.WParam)+,+Message丄Param;顯示鼠標屏幕坐標Label2-Caption=AnsiString(xRange)+,+AnsiString(yRange);/顯示Form的最大坐標值if(Message.Msg=WM_MOVE)yRange二Top+Height;/得到Form的最大橫坐標xRange二Left+Width;得到Form的最大縱坐標if(Form1-TopTop=0;flag二true;if(Top=20)flag二false;TForm:WndProc(Message);

14、在C+Builder6.0下編譯運行通過,實現(xiàn)了熱區(qū)的功能。4動態(tài)鏈接庫的優(yōu)點動態(tài)鏈接庫有很多的優(yōu)點,總結如下:(1)代碼的復用。DLL代碼可以供多個程序使用。如某個設備的驅動程序可以通過DLL發(fā)布,需要使用該設備的應用程序都可以通過調用這個DLL實現(xiàn),這就避免為一個功能重復開發(fā)多份代碼。(2)代碼在應用程序間共享。DLL的好處不僅在邏輯上的共享,還包括物理上的共享。多個應用程序使用DLL時,不必DLL代碼的拷貝,它們可以共享已載入物理內存的DLL代碼段,這樣可以節(jié)約每個應用程序所占的內存。(3)代碼按功能分離。DLL能將應用程序代碼中重要和獨立的功能分離出來,以后程序這部分功能的修改、升級,只要替換該DLL文件。同時程序的維護也方便了。動態(tài)庫可被多種計算機語言調用,便于在各種環(huán)境下的系統(tǒng)集成。5結束語動態(tài)鏈接庫實際上還有很多應用,如:組件技術、Windows服務等等。動態(tài)鏈接庫可以實現(xiàn)代碼和資源的共享,大大減少系統(tǒng)資源的占用,因此在當今的應用程序開發(fā)中起著非常重要的作用。參考文獻:CHARLIECALVERT.C+Builder應用開

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論