版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、Fundamentals of Computers暨南大學珠海學院Windows編程制作:劉曉翔2022-2-10第九講 動態(tài)鏈接庫Fundamentals of Computers制作:劉曉翔JINAN University暨南大學珠海學院Windows編程2022-2-102內(nèi)容安排內(nèi)容安排動態(tài)鏈接庫動態(tài)鏈接庫n Win32 DLL 的創(chuàng)建的創(chuàng)建n 顯式加載方式加載顯式加載方式加載DLLn DllMain函數(shù)函數(shù)n 動態(tài)鏈接庫概述動態(tài)鏈接庫概述n MFC DLLn 隱式鏈接方式加載隱式鏈接方式加載DLLFundamentals of Computers制作:劉曉翔JINAN Univers
2、ity暨南大學珠海學院Windows編程2022-2-103動態(tài)鏈接庫概述動態(tài)鏈接庫概述n動態(tài)鏈接庫動態(tài)鏈接庫不能直接運行,不能接收消息不能直接運行,不能接收消息。它們是一些獨立的文。它們是一些獨立的文件,其中包含能被可執(zhí)行程序或其它件,其中包含能被可執(zhí)行程序或其它DLL調(diào)用來完成某項工作的函調(diào)用來完成某項工作的函數(shù)。數(shù)。只有在其它模塊調(diào)用動態(tài)鏈接庫中的函數(shù)時,它才發(fā)揮作用只有在其它模塊調(diào)用動態(tài)鏈接庫中的函數(shù)時,它才發(fā)揮作用。n 微軟任何一個版本的微軟任何一個版本的Windows操作系統(tǒng),操作系統(tǒng),動態(tài)鏈接庫動態(tài)鏈接庫(DLL)都)都是其是其核心核心和和基礎基礎。n Windows API中的
3、所有函數(shù)都包含在中的所有函數(shù)都包含在DLL中。其中有中。其中有3個最重要的個最重要的DLL,Kernel32.dll,它包含用于管理內(nèi)存、進程和線程的各個函數(shù);,它包含用于管理內(nèi)存、進程和線程的各個函數(shù);User32.dll,它包含用于執(zhí)行用戶界面任務(如窗口的創(chuàng)建和消息的,它包含用于執(zhí)行用戶界面任務(如窗口的創(chuàng)建和消息的傳送)的各個函數(shù);傳送)的各個函數(shù);GDI32.dll,它包含用于畫圖和顯示文本的各個,它包含用于畫圖和顯示文本的各個函數(shù)。函數(shù)。Dll 概述概述Fundamentals of Computers制作:劉曉翔JINAN University暨南大學珠海學院Windows編程2
4、022-2-104動態(tài)鏈接庫概述動態(tài)鏈接庫概述靜態(tài)庫(靜態(tài)庫(LIB)和動態(tài)庫()和動態(tài)庫(DLL)n 靜態(tài)庫:靜態(tài)庫:函數(shù)和數(shù)據(jù)被編譯進一個二進制文件(通常擴展函數(shù)和數(shù)據(jù)被編譯進一個二進制文件(通常擴展名為名為.LIB)。在使用靜態(tài)庫的情況下,在編譯鏈接可執(zhí)行文)。在使用靜態(tài)庫的情況下,在編譯鏈接可執(zhí)行文件時,鏈接器從庫中件時,鏈接器從庫中復制復制這些函數(shù)和數(shù)據(jù),并把它們和應用這些函數(shù)和數(shù)據(jù),并把它們和應用程序的其它模塊組合起來創(chuàng)建最終的可執(zhí)行文件(程序的其它模塊組合起來創(chuàng)建最終的可執(zhí)行文件(.EXE文文件)。件)。n 在使用在使用動態(tài)庫動態(tài)庫的時候,往往提供兩個文件:的時候,往往提供兩個文
5、件:一個引入庫一個引入庫和和一個一個DLL。引入庫引入庫包含被包含被DLL導出的導出的函數(shù)和變量的符號名函數(shù)和變量的符號名,DLL包含實際的函數(shù)和數(shù)據(jù)包含實際的函數(shù)和數(shù)據(jù)。在編譯鏈接可執(zhí)行文件時,只。在編譯鏈接可執(zhí)行文件時,只需要鏈接引入庫,需要鏈接引入庫,DLL中的函數(shù)代碼和數(shù)據(jù)中的函數(shù)代碼和數(shù)據(jù)并不復制并不復制到可執(zhí)到可執(zhí)行文件中,在運行的時候,再去加載行文件中,在運行的時候,再去加載DLL,訪問,訪問DLL中導出中導出的函數(shù)。的函數(shù)。Fundamentals of Computers制作:劉曉翔JINAN University暨南大學珠海學院Windows編程2022-2-105動態(tài)鏈接
6、庫概述動態(tài)鏈接庫概述使用動態(tài)鏈接庫的好處使用動態(tài)鏈接庫的好處 增強程序的擴展性增強程序的擴展性 可以采用多種編程語言來寫可以采用多種編程語言來寫 提供二次開發(fā)的平臺提供二次開發(fā)的平臺 簡化項目管理簡化項目管理 節(jié)省磁盤空間和內(nèi)存節(jié)省磁盤空間和內(nèi)存 有助于資源共享有助于資源共享Fundamentals of Computers制作:劉曉翔JINAN University暨南大學珠海學院Windows編程2022-2-106內(nèi)容安排內(nèi)容安排n Win32 DLL 的創(chuàng)建的創(chuàng)建n 顯式加載方式加載顯式加載方式加載DLLn DllMain函數(shù)函數(shù)n 動態(tài)鏈接庫概述動態(tài)鏈接庫概述n MFC DLLn 隱
7、式鏈接方式加載隱式鏈接方式加載DLL動態(tài)鏈接庫動態(tài)鏈接庫Fundamentals of Computers制作:劉曉翔JINAN University暨南大學珠海學院Windows編程2022-2-107Win32 DLL 的創(chuàng)建的創(chuàng)建創(chuàng)建創(chuàng)建Dll文件文件 新建一個新建一個 Win32 Dynamic-Link Library 工程,在工程,在AppWizard的第一步選擇的第一步選擇“An empty Dll project”,創(chuàng)建一個空,創(chuàng)建一個空的動態(tài)鏈接庫工程。添加一個的動態(tài)鏈接庫工程。添加一個C+源文件:源文件:Dll.cpp,在其中寫,在其中寫入如下代碼:入如下代碼:int ad
8、d(int a, int b)return a + b;int subtract(int a, int b)return a - b;Build后,在后,在Debug目錄下會產(chǎn)生一個目錄下會產(chǎn)生一個Dll1.dll文件。文件。Fundamentals of Computers制作:劉曉翔JINAN University暨南大學珠海學院Windows編程2022-2-108Win32 DLL 的創(chuàng)建的創(chuàng)建導出導出DLL中的函數(shù)中的函數(shù) 注意注意:應用程序如果想要訪問:應用程序如果想要訪問 DLL中的函數(shù),那么該函數(shù)中的函數(shù),那么該函數(shù)必須是已經(jīng)必須是已經(jīng)被導出被導出的函數(shù)。的函數(shù)。 為了讓為了讓
9、DLL 導出函數(shù),需要在每一個將要被導出的導出函數(shù),需要在每一個將要被導出的函數(shù)前函數(shù)前添加標識符:添加標識符:_declspec (dllexport)。_declspec (dllexport) int add(int a, int b)return a + b;_declspec (dllexport) int subtract(int a, int b)return a - b;Build后,在后,在Debug目錄下會產(chǎn)生一個動態(tài)庫目錄下會產(chǎn)生一個動態(tài)庫Dll1.dll文件和一個文件和一個引入庫文件引入庫文件Dll1.lib。Fundamentals of Computers制作:劉曉
10、翔JINAN University暨南大學珠海學院Windows編程2022-2-109Win32 DLL 的創(chuàng)建的創(chuàng)建導出導出DLL中的類中的類 在動態(tài)鏈接庫中,除了函數(shù)能被導出,在動態(tài)鏈接庫中,除了函數(shù)能被導出,C+類同樣也類同樣也能夠被導出。能夠被導出。 為了讓為了讓DLL導出類,在導出類,在DLL中定義類時,需要在中定義類時,需要在class關鍵字和類名之間關鍵字和類名之間加入標識符:加入標識符:_declspec (dllexport)。 注意:注意:在訪問導出類的函數(shù)時,仍受限于函數(shù)自身的在訪問導出類的函數(shù)時,仍受限于函數(shù)自身的訪問權限。也就是說,如果該類的某個函數(shù)訪問權限不是訪問
11、權限。也就是說,如果該類的某個函數(shù)訪問權限不是Pubilc,那么外部程序仍無法訪問這個函數(shù)。,那么外部程序仍無法訪問這個函數(shù)。 另外,在實現(xiàn)動態(tài)鏈接庫時,可以不導出整個類,而另外,在實現(xiàn)動態(tài)鏈接庫時,可以不導出整個類,而只導出該類中的某些成員函數(shù)。具體做法是將標識符添加只導出該類中的某些成員函數(shù)。具體做法是將標識符添加到成員函數(shù)前。到成員函數(shù)前。Fundamentals of Computers制作:劉曉翔JINAN University暨南大學珠海學院Windows編程2022-2-1010內(nèi)容安排內(nèi)容安排n Win32 Dll 的創(chuàng)建的創(chuàng)建n 顯式加載方式加載顯式加載方式加載DLLn Dl
12、lMain函數(shù)函數(shù)n 動態(tài)鏈接庫概述動態(tài)鏈接庫概述n MFC DLLn 隱式鏈接方式加載隱式鏈接方式加載DLL動態(tài)鏈接庫動態(tài)鏈接庫Fundamentals of Computers制作:劉曉翔JINAN University暨南大學珠海學院Windows編程2022-2-1011隱式鏈接方式加載隱式鏈接方式加載DLLDLL測試程序測試程序 新建一個基于對話框的新建一個基于對話框的MFC應用程序,在主對話框資源應用程序,在主對話框資源上放置兩個按鈕上放置兩個按鈕“Add”和和“Subtract”,編寫如下響應函數(shù):,編寫如下響應函數(shù):void CDllTestDlg:OnAdd() CStrin
13、g str;str.Format(7 + 5 = %d, add(7,5);MessageBox(str);void CDllTestDlg:OnSubtract() CString str;str.Format(7 - 5 = %d, subtract(7,5);MessageBox(str);Fundamentals of Computers制作:劉曉翔JINAN University暨南大學珠海學院Windows編程2022-2-1012隱式鏈接方式加載隱式鏈接方式加載DLLextern int add(int a,int b);extern int subtract(int a,int
14、 b);void CDllTestDlg:OnAdd() CString str;str.Format(7 + 5 = %d, add(7,5);MessageBox(str);void CDllTestDlg:OnSubtract() CString str;str.Format(7 - 5 = %d, subtract(7,5);MessageBox(str);利用利用 extern 聲明外部函數(shù)聲明外部函數(shù) 以上程序編譯提示兩個錯誤:不認識函數(shù)以上程序編譯提示兩個錯誤:不認識函數(shù)add與與subtract。因此,需對這兩個函數(shù)做一個聲明。因此,需對這兩個函數(shù)做一個聲明。 extern 關
15、鍵字表明函關鍵字表明函數(shù)是在外部定義的數(shù)是在外部定義的Fundamentals of Computers制作:劉曉翔JINAN University暨南大學珠海學院Windows編程2022-2-1013隱式鏈接方式加載隱式鏈接方式加載DLL 以上程序能夠成功通過編譯,但在程序鏈接時會以上程序能夠成功通過編譯,但在程序鏈接時會產(chǎn)生三個錯誤,因為此時鏈接器不知道這兩個函數(shù)是產(chǎn)生三個錯誤,因為此時鏈接器不知道這兩個函數(shù)是在哪個地方實現(xiàn)的。在哪個地方實現(xiàn)的。 為了解決這個問題,就需要利用動態(tài)鏈接庫的為了解決這個問題,就需要利用動態(tài)鏈接庫的引引入庫文件入庫文件。引入庫文件并沒有包含實際的代碼,它是。引
16、入庫文件并沒有包含實際的代碼,它是用來為鏈接程序提供必要的信息,以便在可執(zhí)行文件用來為鏈接程序提供必要的信息,以便在可執(zhí)行文件中建立動態(tài)鏈接時需要用到的重定位表。中建立動態(tài)鏈接時需要用到的重定位表。使用引入庫文件使用引入庫文件Fundamentals of Computers制作:劉曉翔JINAN University暨南大學珠海學院Windows編程2022-2-1014隱式鏈接方式加載隱式鏈接方式加載DLL加入引入庫的兩種方法加入引入庫的兩種方法加載之前先把加載之前先把dll1.lib復制到復制到dlltest工程目錄中:工程目錄中:方法一:方法一: 選擇選擇“projectSetting
17、s”命令,選擇命令,選擇link選項卡,選項卡,在在“Object/library modules”選項編輯框中輸入:選項編輯框中輸入:dll1.lib方法二:方法二: 通過通過“add files to project”直接將直接將dll1.lib加加入到工程中。入到工程中。Fundamentals of Computers制作:劉曉翔JINAN University暨南大學珠海學院Windows編程2022-2-1015隱式鏈接方式加載隱式鏈接方式加載DLL 除了使用除了使用 extern 關鍵字表明函數(shù)是外部定義的之關鍵字表明函數(shù)是外部定義的之外,還可以使用標識符:外,還可以使用標識符:
18、_declspec (dllimport)來表明來表明函數(shù)是從動態(tài)鏈接庫中引入的。函數(shù)是從動態(tài)鏈接庫中引入的。 與使用與使用 extern 相比,使用相比,使用_declspec (dllimport) 將將告訴編譯器該函數(shù)是來源于動態(tài)鏈接庫,從而編譯器告訴編譯器該函數(shù)是來源于動態(tài)鏈接庫,從而編譯器可以生成運行效率更高的代碼可以生成運行效率更高的代碼。利用利用_declspec (dllimport) 聲明外部函數(shù)聲明外部函數(shù)_declspec (dllimport) int add(int a,int b);_declspec (dllimport) subtract(int a,int b
19、);Fundamentals of Computers制作:劉曉翔JINAN University暨南大學珠海學院Windows編程2022-2-1016隱式鏈接方式加載隱式鏈接方式加載DLL 為查看一個可執(zhí)行模塊依賴的動態(tài)鏈接庫,為查看一個可執(zhí)行模塊依賴的動態(tài)鏈接庫, Visual Studio提供了一個圖形化工具提供了一個圖形化工具Depends來實現(xiàn)。位于:來實現(xiàn)。位于:“Microsoft Visual Studio 6.0Microsoft Visual Studio 6.0 Tools”菜單中。菜單中。Depends工具工具 在在Depends窗口中,左上方的窗格中顯示了應用程序窗
20、口中,左上方的窗格中顯示了應用程序需要訪問的需要訪問的DLL文件名稱;當選中其中的一個文件名稱;當選中其中的一個DLL時,時,右上方的窗格列出了該右上方的窗格列出了該DLL中被可執(zhí)行程序調(diào)用的函數(shù);中被可執(zhí)行程序調(diào)用的函數(shù);右下方的窗格列出了右下方的窗格列出了DLL所導出的函數(shù)。所導出的函數(shù)。Fundamentals of Computers制作:劉曉翔JINAN University暨南大學珠海學院Windows編程2022-2-1017內(nèi)容安排內(nèi)容安排n Win32 DLL 的創(chuàng)建的創(chuàng)建n 顯式加載方式加載顯式加載方式加載DLLn DllMain函數(shù)函數(shù)n 動態(tài)鏈接庫概述動態(tài)鏈接庫概述n
21、MFC DLLn 隱式鏈接方式加載隱式鏈接方式加載DLL動態(tài)鏈接庫動態(tài)鏈接庫Fundamentals of Computers制作:劉曉翔JINAN University暨南大學珠海學院Windows編程2022-2-1018顯式加載方式加載顯式加載方式加載DLLLoadLibrary函數(shù)函數(shù)HMODULE LoadLibrary( LPCTSTR lpFileName); 該函數(shù)的作用是將指定的可執(zhí)行模塊映射到調(diào)用進該函數(shù)的作用是將指定的可執(zhí)行模塊映射到調(diào)用進程的地址空間。程的地址空間。LoadLibrary不僅能夠加載不僅能夠加載DLL,還可,還可以加載可執(zhí)行模塊(以加載可執(zhí)行模塊(*.e
22、xe),當加載可執(zhí)行模塊時,),當加載可執(zhí)行模塊時,主要是為了訪問該模塊內(nèi)的資源,例如對話框資源、主要是為了訪問該模塊內(nèi)的資源,例如對話框資源、圖標或位圖資源。圖標或位圖資源。 當獲取到動態(tài)鏈接庫模塊的句柄后,接下來需要獲當獲取到動態(tài)鏈接庫模塊的句柄后,接下來需要獲取該動態(tài)鏈接庫中導出函數(shù)的地址。取該動態(tài)鏈接庫中導出函數(shù)的地址。Fundamentals of Computers制作:劉曉翔JINAN University暨南大學珠海學院Windows編程2022-2-1019顯式加載方式加載顯式加載方式加載DLLGetProcAddress函數(shù)函數(shù)FARPROC GetProcAddress(
23、 HMOUDLE hModule, LPCSTR lpProcName); 該函數(shù)的作用是用來獲取該函數(shù)的作用是用來獲取DLL導出函數(shù)的地址。導出函數(shù)的地址。 hModule:指定:指定DLL模塊的句柄,即模塊的句柄,即LoadLibrary函數(shù)函數(shù)的返回值。的返回值。 LpProcName:字符指針,指定:字符指針,指定DLL導出函數(shù)的名字或導出函數(shù)的名字或函數(shù)的序號。函數(shù)的序號。Fundamentals of Computers制作:劉曉翔JINAN University暨南大學珠海學院Windows編程2022-2-1020顯式加載方式加載顯式加載方式加載DLL顯示加載顯示加載DLL實例
24、實例void CDllTestDlg:OnAdd() HMODULE hModule;hModule = LoadLibrary(Dll1.dll);typedef int (*FUNC) (int a, int b); /定義函數(shù)指針類型定義函數(shù)指針類型FUNC add = (FUNC)GetProcAddress(hModule, add);if (!add)MessageBox(獲取函數(shù)地址失敗獲取函數(shù)地址失敗!);return;CString str;str.Format(7 + 5 = %d, add(7,5);MessageBox(str);Fundamentals of Comp
25、uters制作:劉曉翔JINAN University暨南大學珠海學院Windows編程2022-2-1021顯式加載方式加載顯式加載方式加載DLL名字改編問題名字改編問題 上述程序運行會談處消息框上述程序運行會談處消息框“獲取函數(shù)地址失敗!獲取函數(shù)地址失敗!”,原因如下:原因如下: C+編譯器在生成編譯器在生成DLL時,會對導出的函數(shù)進行時,會對導出的函數(shù)進行名字改名字改編編,并且不同的編譯器使用的改編規(guī)則不一樣,因此改編,并且不同的編譯器使用的改編規(guī)則不一樣,因此改編后的名字不一樣的。后的名字不一樣的。 因此,因此,GetProcAddress的第二個參數(shù)需要寫改編后的函的第二個參數(shù)需要寫
26、改編后的函數(shù)名。數(shù)名。 (改編后的函數(shù)名字可通過(改編后的函數(shù)名字可通過Depends工具查到)工具查到)FUNC add = (FUNC)GetProcAddress(hModule, ?addYAHHHZ);Fundamentals of Computers制作:劉曉翔JINAN University暨南大學珠海學院Windows編程2022-2-1022顯式加載方式加載顯式加載方式加載DLL名字改編問題(續(xù))名字改編問題(續(xù)) 如果希望動態(tài)鏈接庫在編譯時,導出函數(shù)的名稱不要發(fā)如果希望動態(tài)鏈接庫在編譯時,導出函數(shù)的名稱不要發(fā)生改變,在定義導出函數(shù)時,需要加上限定符:生改變,在定義導出函數(shù)時
27、,需要加上限定符:extern Cextern C _declspec (dllexport) int add(int a, int b)return a + b;extern C _declspec (dllexport) int subtract(int a, int b)return a - b; extern “C”可以解決可以解決C+對對C語言之間的函數(shù)名改編問題,但這語言之間的函數(shù)名改編問題,但這種方法有一個缺陷,就是不能用于導出一個類的成員函數(shù),種方法有一個缺陷,就是不能用于導出一個類的成員函數(shù),只能只能用于導出全局函數(shù)這種情況用于導出全局函數(shù)這種情況。Fundamentals of Computers制作:劉曉翔JINAN University暨南大學珠海學院Windows編程2022-2-1023內(nèi)容安排內(nèi)容安排n Win32 Dll 的創(chuàng)建的創(chuàng)建n 顯式加載方式加載顯式加載方式加載Dlln DllMain函數(shù)函數(shù)n 動態(tài)鏈接庫概述動態(tài)鏈接庫概述n MFC Dlln 隱式鏈接方式加載隱式
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 人教版(2024)一年級數(shù)學上冊期末復習專項拔高卷(含答案)
- 河南省許昌市育才學校2025-2026學年七年級上學期期末歷史試卷(含答案)
- 化工企業(yè)消防培訓
- 2026年石化行業(yè)策略報告:上游油價觸底、下游供給側優(yōu)化加速產(chǎn)業(yè)鏈有望迎來共振周期
- 鋼網(wǎng)架結構安裝技術要點
- 鋼結構工程技術(35個)
- 2026山東聊城市市屬事業(yè)單位招聘初級綜合類崗位人員87人考試備考試題及答案解析
- 2026廣東廣州市中山大學腫瘤防治中心中心鼻咽科陳秋燕教授課題組自聘技術員招聘2人備考考試題庫及答案解析
- 三明林校2025-2026學年第二學期外聘教師招聘備考考試題庫及答案解析
- 2026新疆烏市第126中學慈湖初中部急聘初中物理老師備考考試試題及答案解析
- 2026年張家界航空工業(yè)職業(yè)技術學院單招職業(yè)傾向性測試必刷測試卷附答案
- 新版二年級道德與法治《我們都是中國人》教學設計(2課時)
- XX企業(yè)核心優(yōu)勢與戰(zhàn)略發(fā)展
- 2025年中國低氘水行業(yè)市場全景分析及前景機遇研判報告
- 管道區(qū)段長管理辦法
- 2025年江西公務員考試(財經(jīng)管理)測試題及答案
- CRT-YS4690消防控制室圖形顯示裝置使用說明書-營口賽福德
- 植筋工程施工驗收記錄表范例
- 2025至2030年中國冷凍食品行業(yè)市場調(diào)研及行業(yè)投資策略研究報告
- 壓空罐安全知識培訓課件
- 2025年江蘇南京市建鄴區(qū)招聘第一批購崗人員5人筆試模擬試題及答案詳解1套
評論
0/150
提交評論