動(dòng)態(tài)鏈接庫(kù)(DLL)編程深入淺出(4)_第1頁(yè)
動(dòng)態(tài)鏈接庫(kù)(DLL)編程深入淺出(4)_第2頁(yè)
動(dòng)態(tài)鏈接庫(kù)(DLL)編程深入淺出(4)_第3頁(yè)
動(dòng)態(tài)鏈接庫(kù)(DLL)編程深入淺出(4)_第4頁(yè)
動(dòng)態(tài)鏈接庫(kù)(DLL)編程深入淺出(4)_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論