




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、這是VC+動(dòng)態(tài)鏈接庫(kù)(DLL)編程深入淺出的第四部分,閱讀本文前,請(qǐng)先閱讀前三部分:(一)、(二)、(三)。MFC擴(kuò)展DLL的內(nèi)涵為MFC的擴(kuò)展,用戶(hù)使用MFC擴(kuò)展DLL就像使用MFC本身的DLL一樣。除了可以在MFC擴(kuò)展DLL的內(nèi)部使用MFC以外,MFC擴(kuò)展DLL與應(yīng)用程序的接口部分也可以是MFC。我們一般使用MFC擴(kuò)展DLL來(lái)包含一些MFC的增強(qiáng)功能,譬如擴(kuò)展MFC的CStatic、CButton等類(lèi)使之具備更強(qiáng)大的能力。使用Visual C+向?qū)a(chǎn)MFC擴(kuò)展DLL時(shí),MFC向?qū)?huì)自動(dòng)增加DLL的入口函數(shù)DllMain:extern "C" int APIENTRYD
2、llMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) / Remove this if you use lpReserved UNREFERENCED_PARAMETER(lpReserved); if (dwReason = DLL_PROCESS_ATTACH) TRACE0("MFCEXPENDDLL.DLL Initializing!n"); / Extension DLL one-time initializ
3、ation if (!AfxInitExtensionModule(MfcexpenddllDLL, hInstance) return 0; / Insert this DLL into the resource chain / NOTE: If this Extension DLL is being implicitly linked to by / an MFC Regular DLL (such as an ActiveX Control) &
4、#160;/ instead of an MFC application, then you will want to / remove this line from DllMain and put it in a separate / function exported from this Extension DLL. The Regular DLL / that uses this Extension DLL should then explicitly call
5、that / function to initialize this Extension DLL. Otherwise, / the CDynLinkLibrary object will not be attached to the / Regular DLL's resource chain, and serious problems will / result. new CDynLinkLibrary(Mfcex
6、penddllDLL); else if (dwReason = DLL_PROCESS_DETACH) TRACE0("MFCEXPENDDLL.DLL Terminating!n"); / Terminate the library before destructors are called AfxTermExtensionModule(MfcexpenddllDLL); return 1; / ok上述代碼完成MFC擴(kuò)展DL
7、L的初始化和終止處理。由于MFC擴(kuò)展DLL導(dǎo)出函數(shù)和變量的方式與其它DLL沒(méi)有什么區(qū)別,我們不再細(xì)致講解。下面直接給出一個(gè)MFC擴(kuò)展DLL的創(chuàng)建及在應(yīng)用程序中調(diào)用它的例子。6.1 MFC擴(kuò)展DLL的創(chuàng)建下面我們將在MFC擴(kuò)展DLL中導(dǎo)出一個(gè)按鈕類(lèi)CSXButton(擴(kuò)展自MFC的CButton類(lèi)),類(lèi)CSXButton是一個(gè)用以取代 CButton的類(lèi),它使你能在同一個(gè)按鈕上顯示位圖和文字,而MFC的按鈕僅可顯示二者之一。類(lèi)CSXbutton的源代碼在Internet上廣泛流傳,有很好的“群眾基礎(chǔ)”,因此用這個(gè)類(lèi)來(lái)講解MFC擴(kuò)展DLL有其特殊的功效。MFC中包含一些宏,這些宏在DLL和調(diào)用DL
8、L的應(yīng)用程序中被以不同的方式展開(kāi),這使得在DLL和應(yīng)用程序中,使用統(tǒng)一的一個(gè)宏就可以表示出輸出和輸入的不同意思:/ for data#ifndef AFX_DATA_EXPORT #define AFX_DATA_EXPORT _declspec(dllexport)#endif#ifndef AFX_DATA_IMPORT #define AFX_DATA_IMPORT _declspec(dllimport)#endif/ for classes#ifndef AFX_CLASS_EXPORT #define AFX_CLASS_EXPORT _declspe
9、c(dllexport)#endif#ifndef AFX_CLASS_IMPORT #define AFX_CLASS_IMPORT _declspec(dllimport)#endif/ for global APIs#ifndef AFX_API_EXPORT #define AFX_API_EXPORT _declspec(dllexport)#endif#ifndef AFX_API_IMPORT #define AFX_API_IMPORT _declspec(dllimport)#endif#ifndef AFX_EXT_DATA #ifd
10、ef _AFXEXT #define AFX_EXT_CLASS AFX_CLASS_EXPORT #define AFX_EXT_API AFX_API_EXPORT #define AFX_EXT_DATA AFX_DATA_EXPORT #define
11、AFX_EXT_DATADEF #else #define AFX_EXT_CLASS AFX_CLASS_IMPORT #define AFX_EXT_API AFX_API_IMPORT #define AFX_EXT_DATA AFX_DATA_IMPORT
12、0; #define AFX_EXT_DATADEF #endif#endif導(dǎo)出一個(gè)類(lèi),直接在類(lèi)聲明頭文件中使用AFX_EXT_CLASS即可,以下是導(dǎo)出CSXButton類(lèi)的例子:#ifndef _SXBUTTON_H#define _SXBUTTON_H#define SXBUTTON_CENTER -1class AFX_EXT_CLASS CSXButton : public CButton/ Constructionpublic: CSXButton();/ Attributesprivate: / Positi
13、oning BOOL m_bUseOffset; CPoint m_pointImage; CPoint m_pointText; int m_nImageOffsetFromBorder; int m_nTextOffsetFromImage; / Image HICON m_hIcon;
14、 HBITMAP m_hBitmap; HBITMAP m_hBitmapDisabled; int m_nImageWidth, m_nImageHeight; / Color Tab char m_bColorTab; COLORREF m_crColorTab; / State BOOL
15、 m_bDefault; UINT m_nOldAction; UINT m_nOldState; / Operationspublic: / Positioning int SetImageOffset( int nPixels ); int SetTextOffset( int nPixels ); CPoint SetImagePos( CPoint p ); CPoint Set
16、TextPos( CPoint p ); / Image BOOL SetIcon( UINT nID, int nWidth, int nHeight ); BOOL SetBitmap( UINT nID, int nWidth, int nHeight ); BOOL SetMaskedBitmap( UINT nID, int nWidth, int nHeight, COLORREF crTransparentMask ); BOOL HasImage() return (BOOL)(
17、 m_hIcon != 0 | m_hBitmap != 0 ); / Color Tab void SetColorTab(COLORREF crTab); / State BOOL SetDefaultButton( BOOL bState = TRUE );private: BOOL SetBitmapCommon( UINT nID, int nWidth, int nHeight, COLORREF crTransparentMask, BOOL bUseMask );&
18、#160;void CheckPointForCentering( CPoint &p, int nWidth, int nHeight ); void Redraw();/ Overrides / ClassWizard generated virtual function overrides /AFX_VIRTUAL(CSXButton) public: virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct); /AFX_VIRTUAL/ Imp
19、lementationpublic: virtual CSXButton(); / Generated message map functionsprotected: /AFX_MSG(CSXButton) afx_msg LRESULT OnGetText(WPARAM wParam, LPARAM lParam); /AFX_MSG DECLARE_MESSAGE_MAP();#endif把SXBUTTON.CPP文件直接添加到工程,編譯工程,得到“mfcexpenddll.lib”和“mfcexpenddll.dll”兩個(gè)文件。
20、我們用Visual Studio自帶的Depends工具可以查看這個(gè).dll,發(fā)現(xiàn)其導(dǎo)出了眾多符號(hào)(見(jiàn)圖15)。 圖15 導(dǎo)出類(lèi)時(shí)導(dǎo)出的大量符號(hào) 這些都是類(lèi)的構(gòu)造函數(shù)、析構(gòu)函數(shù)及其它成員函數(shù)和變量經(jīng)編譯器處理過(guò)的符號(hào),我們直接用_declspec(dllexport)語(yǔ)句聲明類(lèi)就導(dǎo)出了這些符號(hào)。如果我們想用.lib文件導(dǎo)出這些符號(hào),是非常困難的,我們需要在工程中生成.map文件,查詢(xún).map文件的符號(hào),然后將其一一導(dǎo)出。如圖16,打開(kāi)DLL工程的settings選項(xiàng),再選擇Link,勾選其中的產(chǎn)生MAP文件(Generate mapfile)就可以產(chǎn)生.map文件了。 打開(kāi)
21、mfcexpenddll工程生成的.map文件,我們發(fā)現(xiàn)其中包含了圖15中所示的符號(hào)(symbol) 0001:00000380 ?HasImageCSXButtonQAEHXZ 10001380 f i SXBUTTON.OBJ 0001:000003d0 ?0CSXButtonQAEXZ 100013d0 f SXBUTTON.OBJ 0001:00000500 ?_GCSXButtonUAEPAXIZ 1
22、0001500 f i SXBUTTON.OBJ 0001:00000570 ?_ECSXButtonUAEPAXIZ 10001570 f i SXBUTTON.OBJ 0001:00000630 ?1CSXButtonUAEXZ 10001630 f SXBUTTON.OBJ0001:00000700 ?_GetBaseMessageMapCSXButtonKGPBUAFX_MSGMAPXZ 10001700 f
23、160; SXBUTTON.OBJ 0001:00000730 ?GetMessageMapCSXButtonMBEPBUAFX_MSGMAPXZ 10001730 f SXBUTTON.OBJ 0001:00000770 ?RedrawCSXButtonAAEXXZ 10001770 f i SXBUTTON.OBJ 0001:000007d0 ?SetIconCSXButtonQAEHIHHZ 100017d0 f SXBUTTO
24、N.OBJ./省略 圖16 產(chǎn)生.map文件 所以,對(duì)于MFC擴(kuò)展DLL,我們不宜以.lib文件導(dǎo)出類(lèi)。6.2 MFC擴(kuò)展DLL的調(diào)用在DLL所在工作區(qū)新增一個(gè)dllcall工程,它是一個(gè)基于對(duì)話(huà)框的MFC EXE程序。在其中增加兩個(gè)按鈕SXBUTTON1、SXBUTTON2,并設(shè)置其屬性為“Owner draw”,如圖17。圖17 設(shè)置按鈕屬性為“Owner draw”在工程中添加兩個(gè)ICON資源:IDI_MSN_ICON(MSN的圖標(biāo))、IDI_REFBAR_ICON(Windows的系統(tǒng)圖標(biāo))。修改工程的“calldllDlg.h”頭文件為:#include ".mf
25、cexpenddllSXBUTTON.h" /包含dll的導(dǎo)出類(lèi)頭文件#pragma comment(lib,"mfcexpenddll.lib") /隱式鏈接dll/ CCalldllDlg dialogclass CCalldllDlg : public CDialog/ Constructionpublic: CCalldllDlg(CWnd* pParent = NULL); / standard constructor/ Dialog Data /AFX_DATA(CCalld
26、llDlg) enum IDD = IDD_CALLDLL_DIALOG ;/增加與兩個(gè)按鈕對(duì)應(yīng)的成員變量 CSXButton m_button1; CSXButton m_button2;同時(shí),修改“calldllDlg.cpp”文件,使得m_button1、m_button2成員變量與對(duì)話(huà)框上的按鈕控件建立關(guān)聯(lián):void CCalldllDlg:DoDataExchange(CDataExchange* pDX) CDialog:DoDataExchange(pDX); /AFX_DATA_MA
27、P(CCalldllDlg) DDX_Control(pDX, IDC_BUTTON2, m_button2); DDX_Control(pDX, IDC_BUTTON1, m_button1); /AFX_DATA_MAP修改BOOL CCalldllDlg:OnInitDialog()函數(shù),在其中增加對(duì)兩個(gè)按鈕設(shè)置ICON的代碼:BOOL CCalldllDlg:OnInitDialog() CDialog:OnInitDialog(); / Add "About." menu item to system menu.&
28、#160;/ IDM_ABOUTBOX must be in the system command range. ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) CString strAboutMenu; strAboutMenu.LoadString(ID
29、S_ABOUTBOX); if (!strAboutMenu.IsEmpty() pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); / Set the icon for this dialog. The framework does this automatically / when the application's main window is no
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2025學(xué)年高中語(yǔ)文第四單元尋覓文言津梁研習(xí)活動(dòng)鴻門(mén)宴練習(xí)蘇教版必修3
- 2024-2025學(xué)年高中生物第二章第二節(jié)人體生命活動(dòng)的調(diào)節(jié)一課時(shí)作業(yè)含解析蘇教版必修3
- 2024-2025學(xué)年高中英語(yǔ)語(yǔ)法專(zhuān)題8冠詞教案含解析新人教版必修1
- 2025年中國(guó)橡膠腳蹼行業(yè)市場(chǎng)調(diào)研分析及投資戰(zhàn)略咨詢(xún)報(bào)告
- 2019-2025年中國(guó)電子商務(wù)配送行業(yè)市場(chǎng)調(diào)查研究及投資前景預(yù)測(cè)報(bào)告
- 中國(guó)鼻科手術(shù)器械市場(chǎng)供需現(xiàn)狀及投資戰(zhàn)略研究報(bào)告
- 2025年電子墊片項(xiàng)目可行性研究報(bào)告
- 中國(guó)蒸汽拖把行業(yè)市場(chǎng)深度分析及行業(yè)發(fā)展趨勢(shì)報(bào)告
- 2025年天氣預(yù)告顯示屏項(xiàng)目投資可行性研究分析報(bào)告
- 電視植入廣告行業(yè)發(fā)展監(jiān)測(cè)及投資戰(zhàn)略咨詢(xún)報(bào)告
- 《黃色新聞的泛濫》課件
- 2024年山東省公務(wù)員考試《行測(cè)》真題及答案解析
- 化工原理Ⅱ?qū)W習(xí)通超星期末考試答案章節(jié)答案2024年
- 2024-2025學(xué)年初中體育與健康九年級(jí)全一冊(cè)人教版(2024)教學(xué)設(shè)計(jì)合集
- 環(huán)保產(chǎn)業(yè)政策及市場(chǎng)發(fā)展趨勢(shì)分析研究
- 2024年河南省高考對(duì)口升學(xué)語(yǔ)文英語(yǔ)試題
- 學(xué)習(xí)白求恩精神,做一個(gè)高尚的人一個(gè)純潔的人
- 《中醫(yī)藥學(xué)概論》期末考試復(fù)習(xí)題庫(kù)(含答案)
- 2024年秋季新外研版三年級(jí)上冊(cè)英語(yǔ)課件 Unit 1 第1課時(shí)(Get ready)
- 單位委托員工辦理水表業(yè)務(wù)委托書(shū)
- 2024版《保密法》培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論