




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、Windows DLL 編程一、靜態(tài)鏈接庫1.創(chuàng)建一個“Win32 控制臺應用程序”項目。項目名定義為staticdll。2. 在“應用程序設置”中配置為“靜態(tài)庫”,其他默認。3.向生成的項目中添加一個頭文件和一個實現(xiàn)文件,名稱分別為staticlib.h和staticlib.cpp。分別向這兩個文中添加如下代碼:/staticlib.h#ifndef LIB_H#define LIB_Hextern "C" int add(int x,int y); /聲明為C編譯、連接方式的外部函數(shù)#endif/staticlib.cpp#include "stdafx.h&
2、quot;#include "staticlib.h"int add(int x,int y)return x + y;4.編譯鏈接后會在解決方案的根目錄下的debug目錄中得到一個staticdll.lib庫文件。該文件就是靜態(tài)庫的關鍵文件。使用該庫文件,將其編譯鏈接到用戶程序中,就可以調用在靜態(tài)庫中定義的導出函數(shù)add。5.測試靜態(tài)庫staticdll.lib。1)創(chuàng)建一個“win32控制臺應用程序”項目。名稱為:staticdlltest。2)配置“應用程序設置”為“控制臺應用程序”,其他默認。3)在主staticdlltest.cpp文件中主要代碼如下所示。/ St
3、aticDllTest.cpp : 定義控制臺應用程序的入口點。/#include "stdafx.h"#include ".StaticDllstaticLib.h"#pragma comment(lib, ".debugstaticdll.lib")/指定與靜態(tài)庫一起連接int _tmain(int argc, _TCHAR* argv)printf( "2 + 3 = %dn", add( 2, 3 ) );return 0;二、Win32 動態(tài)鏈接庫1. 創(chuàng)建一個“Win32 控制臺應用程序”。名稱為Non
4、MfcDll。2. 配置“應用程序設置”為“DLL”。3. 向生成的項目中添加一個頭文件和一個實現(xiàn)文件,名稱分別為nonmfclib.h和nonmfclib.cpp。分別向這兩個文中添加如下代碼:/NonMfcLib.h#ifndef LIB_H#define LIB_Hextern "C" _declspec(dllexport) int add(int x, int y);#endif/NonMfcLib.cpp#include "stdafx.h"#include "NonMfclib.h"int add(int x, int
5、y)return x + y;從以上代碼中,可以看出我們在本項目中添加了一個導出函數(shù)add。4. 為了驗證類的導出情況,我們再向本項目中添加一個C+類。名稱為CmyClass。下面是該類的頭文件及實現(xiàn)文件的具體代碼。/CmyClass.h#pragma onceextern "C" _declspec(dllexport) void ext_hello();class _declspec(dllexport) CmyClasspublic:CmyClass(void);CmyClass(void);void Hello(void);/CmyClass.cpp#include
6、 "StdAfx.h"#include "CmyClass.h"#include <iostream>using namespace std;void ext_hello()CmyClass myCls;myCls.Hello();CmyClass:CmyClass(void)CmyClass:CmyClass(void)void CmyClass:Hello(void)cout << "大家好!" << endl;CmyClass類中包含了一個成員函數(shù)Hello。不過在用戶函數(shù)中無法直接調用該函數(shù)
7、,必須使用另外一個類外部函數(shù)進行間接調用類成員函數(shù)。因此,添加了一個ext_hello函數(shù)用來間接調用一個CmyClass類的對象實例的Hello函數(shù),來達到對類的成員函數(shù)的導出使用。5. 編譯鏈接后會在解決方案的根目錄下的debug目錄中得到一個nonmfcdll.lib庫文件和nonmfcdll.dll動態(tài)鏈接文件。Lib庫文件用來進行靜態(tài)導入,而dll用來動態(tài)導入。不過請注意這里的lib文件和靜態(tài)庫的lib文件是不一樣的。這里的lib文件只包含了導出函數(shù)的接口說明,而真正的導出函數(shù)的執(zhí)行體實際在dll文件中。6. 動態(tài)導入win32動態(tài)鏈接庫。1) 創(chuàng)建一個“Win32控制臺應用程序”項
8、目。名稱為NonMfcDlltest。2) 配置“應用程序設置”為“控制臺程序”,其他默認。3) 在NonMfcDlltest.cpp文件的代碼如下所示:/ NonMfcDllTest.cpp : 定義控制臺應用程序的入口點。/#include "stdafx.h"#include <Windows.h>typedef int(*lpAddFun)(int,int);int _tmain(int argc, _TCHAR* argv)HINSTANCE hDll;lpAddFun addFun;lpHelloFun helloFun;hDll = LoadLib
9、rary(_T(".DebugNonMfcDll.dll");if (hDll != NULL)addFun = (lpAddFun)GetProcAddress(hDll,"add");if (addFun != NULL)int result = addFun(2,3);printf("%dn",result);FreeLibrary(hDll);return 0;由上述代碼可以總結動態(tài)鏈接庫的動態(tài)導入的基本步驟大致如下:l 定義一個需要導入的動態(tài)鏈接庫導出函數(shù)的函數(shù)指針類型;l 使用LoadLibrary函數(shù)動態(tài)加載動態(tài)鏈接庫;
10、l 使用GetProcAddress函數(shù)獲取動態(tài)鏈接庫導出函數(shù)地址;l 使用函數(shù);l 使用FreeLibrary函數(shù)釋放動態(tài)鏈接庫;4) 采用動態(tài)導入方式,只能通過間接使用類外部函數(shù)來調用類的成員。不能直接在用戶程序中直接使用類的對象來調用成員。7. 靜態(tài)導入Win32動態(tài)鏈接庫1) 創(chuàng)建一個“Win32控制臺應用程序”項目。名稱為NonMfcDllStaticCall。2) 配置“應用程序設置”為“控制臺程序”,其他默認。3) 在NonMfcDllStaticCall.cpp文件的代碼如下所示:#include "stdafx.h"#include "CmyCl
11、ass.h"#pragma comment(lib,".debugNonMfcDll.lib")extern "C" _declspec(dllimport) int add(int x,int y);int _tmain(int argc, _TCHAR* argv)int result = add(2,3); printf("%dn",result);CmyClass myCls;myCls.Hello();return 0;這里需要注意的是,必須將動態(tài)鏈接庫中定義的類的頭文件拷貝到測試項目的根目錄下,并且在項目主CPP
12、文件中將該頭文件包含。然后,使用#pragma comment指示編譯器靜態(tài)鏈接動態(tài)鏈接庫到項目中,并將需要導入的函數(shù)接口在主CPP文件中進行聲明。三、MFC 常規(guī)動態(tài)鏈接庫1創(chuàng)建一個“MFC DLL”項目。名稱為 StaticMfcRegularDll。2. 配置“應用程序設置”為“帶靜態(tài)鏈接MFC的規(guī)則DLL”。3. 在MFC 規(guī)則DLL中導出函數(shù),導出類的方法與前面介紹的Win32 DLL中的方法完全一致,因此,在此就不再進行說明。4. MFC DLL最大的特點就是可以使用MFC類庫。因此,我們?yōu)轫椖刻砑右粋€ID為IDD_DIALOG1的對話框資源,然后為該對話框添加一個派生于CDial
13、og的類:CDllDlg。對話框資源,你可以根據(jù)你的需求定義。我們這里就進行最簡單的布置為如下圖的形式,以便在用戶程序中調用時,明確這是來之DLL中的對話框資源。由于,MFC規(guī)則DLL不允許導出整個類,以及類的成員函數(shù),所以,為了保證用戶程序能夠調用該對話框資源,因此,必須在類外部實現(xiàn)一個外部函數(shù)。具體代碼如下所示:/StaticMfcRegularDll.hextern "C" void _declspec(dllexport)ShowDlg();/StaticMfcRegularDll.cpp#include "DllDlg.h".void Show
14、Dlg()AFX_MANAGE_STATE(AfxGetStaticModuleState();CDllDlg dlg;dlg.DoModal();.上述代碼所作的工作是:l 聲明一個導出顯示對話框的函數(shù)接口;l 將對話框的頭文件包含如MFC規(guī)則DLL的主CPP文件中;l 定義顯示對話框的函數(shù);注意,建議在任何導出函數(shù)的函數(shù)體開始的位置加入:AFX_MANAGE_STATE(AfxGetStaticModuleState();以保證,不管MFC庫是如何鏈接到本DLL文件中的,都可以保證找到該對話框資源。5. 編譯鏈接后,該項目將生成兩個主要輸出文件:StaticMfcRegularDll.li
15、b和StaticMfcRegularDll.dll。6. 測試該MFC DLL,采用靜態(tài)導入。1)創(chuàng)建一個MFC SDI應用程序項目。2)為了在測試項目中的任何派生類中都能導入到MFC Dll中的導出函數(shù),我們在CWinApp派生類的頭文件中添加以下代碼:#pragma comment(lib,".debugStaticMfcRegularDll.lib")extern "C" _declspec(dllimport) void ShowDlg();從以上代碼可知,我們在測試項目中采用的是靜態(tài)導入方式。3)在測試項目中添加一個菜單資源,ID為ID_DLL
16、TEST_DLLDLG。并為該菜單添加一個命令處理程序,該處理程序添加給CFrameWnd派生類中。然后,在該處理程序的實現(xiàn)中添加對導入函數(shù)ShowDlg的調用,即可。void CMainFrame:OnDlltestDlldlg()/ TODO: 在此添加命令處理程序代碼ShowDlg();7. 測試該MFC Dll,采用動態(tài)導入。1)MFC Dll的動態(tài)導入,與前面我們介紹的Win32 Dll的動態(tài)導入方式是相同的。下面,就在靜態(tài)導入測試項目的基礎上,來實現(xiàn)對函數(shù)ShowDlg的動態(tài)導入。2)我們要做兩件的事情,就是定義一個與ShowDlg函數(shù)的對應的函數(shù)指針類型,然后修改前面的那個菜單資
17、源的命令處理程序的實現(xiàn)。下面這行代碼,加入到CWinApp派生類的頭文件中。typedef void(*ShowDlg)(void);下面,是新的菜單命令處理函數(shù)void CMainFrame:OnDlltestDlldlg()/ TODO: 在此添加命令處理程序代碼HINSTANCE hDll;ShowDlg pSDlg;hDll = LoadLibrary(_T(".debugStaticMfcRegularDll.dll");if (hDll != NULL)pSDlg = (ShowDlg)GetProcAddress(hDll,"ShowDlg"
18、;);if (pSDlg != NULL)pSDlg();FreeLibrary(hDll);四、MFC 擴展動態(tài)鏈接庫MFC 擴展DLL與MFC 規(guī)則DLL的主要區(qū)別是,對于有MFC類派生的派生類,MFC擴展DLL可以導出整個類,而MFC規(guī)則DLL則不行。1) 創(chuàng)建一個“MFC DLL”項目。名稱為 MfcExtDll;2) 配置“應用程序設置”為 “MFC 擴展DLL”;3) 為項目添加一個對話框資源,ID為:IDD_DIALOG1;4) 為該對話框資源添加一個派生于CDialog的MFC派生類。類名為CMyDllDlg;5) 修改CMyDllDlg類的頭文件中,類的接口聲明。class
19、AFX_EXT_CLASS CMyDllDlg : public CDialog在Class 向導自動生成的代碼基礎上,僅是在class關鍵字和類名之間添加上AFX_EXT_CLASS。6) 由于,導入MFC擴展DLL的對話框類時,要求用戶測試程序必須包含類的頭文件,又因為對話框的頭文件中包含了對話框的資源ID,因此在用戶測試文件中還必須包含資源的頭文件resource.h。由于,用戶測試程序中也會包含資源頭文件resource.h,為了避免同一項目文件重名的沖突,因此,這里需要修改DLL項目中的資源頭文件名。按照上圖所示,打開MfcExtDll.rc資源文件。會看到如下形式的代碼內容:/ Microsoft Visual C+ generated resourc
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權】 IEC TS 62453-53-90:2025 EN Field Device Tool (FDT) Interface Specification - Part 53-90: Communication implementation for CLI and HTML – IEC 61784 CPF 9
- 【正版授權】 ISO/IEC 14763-5:2025 EN Information technology – Implementation and operation of customer premises cabling – Part 5: Sustainability
- 2025年中級經(jīng)濟師考試卷及答案
- 2025年藥學專業(yè)附加考試試卷及答案
- 2025年非遺傳承人資格考試試題及答案
- 2025年大數(shù)據(jù)分析專業(yè)考試試題及答案
- 2025年核工程與核技術專業(yè)考試卷及答案
- 一級安全考試題庫及答案
- 吊裝運輸合同協(xié)議書
- 高三文科政治備考工作方案
- 大風天氣下的物流運輸安全措施
- 老舊小區(qū)加裝電梯使用公約協(xié)議
- 新生兒護理安全用藥
- 2025年湖北省新華書店集團有限公司招聘筆試參考題庫含答案解析
- 醫(yī)療護理醫(yī)學培訓 臨時起搏器的使用及參數(shù)調整課件
- 《中國婦女妊娠期體重監(jiān)測與評價》(T-CNSS 009-2021)
- 情境教學法在初中函數(shù)教學中的實踐研究
- 2025年湖南湘西自治州公開招募“三支一扶”高校畢業(yè)生高頻重點提升(共500題)附帶答案詳解
- 2024年國家公務員考試行測真題附解析答案
- 店長晉級管理制度內容
- 行政組織學 課件 第6章 行政組織決策
評論
0/150
提交評論