(整理)动态链接库DLL编程深入浅出4_第1页
(整理)动态链接库DLL编程深入浅出4_第2页
(整理)动态链接库DLL编程深入浅出4_第3页
(整理)动态链接库DLL编程深入浅出4_第4页
(整理)动态链接库DLL编程深入浅出4_第5页
免费预览已结束,剩余6页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、这是VC+动态链接库(DLL)编程深入浅出的第四部分,阅读本文前,请先阅读前三部 分:(一)、(二)、(三)。MFCT展DLL的内涵为MFC勺扩展,用户使用 MFCT展DLL就像使用MFC本身的DLL 一样。除了可以在MFCT展DLL的内部使用MFCA外,MFCT展DLL与应用程序的接口部分也可以是MFC我们一般使用 MFCT展DLL来包含一些 MFC勺增强功能,譬如扩展MFC勺CStatic、CButton等类使之具备更强大的能力。使用Visual C+向导生产 MFCT展DLL时,MFE导会自动增加 DLL的入口函数 DllMain :extern "C" int AP

2、IENTRYDllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) / Remove this if you use lpReservedUNREFERENCED_PARAMETER(lpReserved);if (dwReason = DLL_PROCESS_ATTACH)TRACE0("MFCEXPENDDLL.DLL Initializing!n");/ Extension DLL one-time initializationif (!AfxInitExtensionModule(Mfcexpe

3、nddllDLL, 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)/ instead of an MFC application, then you will want to/ remove this line from DllMain and put it in a separate/ functi

4、on exported from this Extension DLL.The Regular DLL/ that uses this Extension DLL should then explicitly call 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 CD

5、ynLinkLibrary(MfcexpenddllDLL);else if (dwReason = DLL_PROCESS_DETACH)TRACE0("MFCEXPENDDLL.DLL Terminating!n");/ Terminate the library before destructors are calledAfxTermExtensionModule(MfcexpenddllDLL); return 1;/ ok上述代码完成MFCT展DLL的初始化和终止处理。由于MFCT展DLL导出函数和变量的方式与其它DLL没有什么区别,我们不再细致讲解。下面直接给出

6、一个 MFCT展DLL的创建及在应用程序中调用它的例子。6.1 MFC扩展DLL的创建下面我们将在 MFCT展DLL中导出一个按钮类 CSXButton (扩展自MFC勺CButton类),类CSXButton是一个用以取代 CButton的类,它使你能在同一个按钮上显示位图和文字,而MFC勺按钮仅可显示二者之一。类 CSXbutton的源代码在Internet上广泛流传,有很好的“群众基础”,因此用这个类来讲解MFCT展DLL有其特殊的功效。MFC中包含一些宏,这些宏在DLL和调用DLL的应用程序中被以不同的方式展开,这使得在DLL和应用程序中,使用统一的一个宏就可以表示出输出和输入的不同意

7、思:/ 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 _declspec(dllexport)#endif#ifndef AFX_CLASS_IMPORT#define AFX_CLASS_IMPORT _decl

8、spec(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_DATAAFX_CLASS_EXPORTAFX_API_EXPORTAFX_DATA_EXPORTAFX_CLASS_IMPORTAFX_API_IMPORTAFX_DATA_IMPORT#ifdef _A

9、FXEXT#define AFX_EXT_CLASS#define AFX_EXT_API#define AFX_EXT_DATA#define AFX_EXT_DATADEF#else#define AFX_EXT_CLASS#define AFX_EXT_API#define AFX_EXT_DATA#define AFX_EXT_DATADEF#endif#endif导出一个类,直接在类声明头文件中使用AFX_EXT_CLASS可,以下是导出 CSXButton类的例子:#ifndef _SXBUTTON_H#define _SXBUTTON_H#define SXBUTTON_CENT

10、ER -1class AFX_EXT_CLASS CSXButton : public CButton/ Constructionpublic:CSXButton();/ Attributesprivate:/ PositioningBOOL m_bUseOffset;CPoint m_pointImage;CPoint m_pointText;int m_nImageOffsetFromBorder;int m_nTextOffsetFromImage; ImageHICON m_hIcon;HBITMAP m_hBitmap;HBITMAP m_hBitmapDisabled; int m

11、_nImageWidth, m_nImageHeight;/ Color Tabchar m_bColorTab;COLORREF m_crColorTab;/ StateBOOL m_bDefault;UINT m_nOldAction;UINT m_nOldState;/ Operationspublic:/ Positioningint SetImageOffset( int nPixels );int SetTextOffset( int nPixels );CPoint SetImagePos( CPoint p );CPoint SetTextPos( CPoint p );/ I

12、mageBOOL 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)( m_hIcon != 0| m_hBitmap != 0 ); / Color Tabvoid SetColorTab(COLORREF crTab);/

13、 StateBOOL SetDefaultButton( BOOL bState = TRUE );private:BOOL SetBitmapCommon( UINT nID, int nWidth, int nHeight, COLORREF crTransparentMask, BOOL bUseMask );void CheckPointForCentering( CPoint &p, int nWidth, int nHeight );void Redraw();/ Overrides/ ClassWizard generated virtual function overr

14、ides/AFX_VIRTUAL(CSXButton)public:virtual void DrawItem(LPDRAWITEMSTRUCT IpDrawItemStruct);/AFX_VIRTUAL/ Implementationpublic:virtual CSXButton();/ Generated message map functionsprotected:/AFX_MSG(CSXButton)afx_msg LRESULT OnGetText(WPARAM wParam, LPARAM lParam);/AFX_MSGDECLARE_MESSAGE_MAP();#endif

15、把SXBUTTON.CPP件直接添加到工程,编译工程,得到“ mfcexpenddll.lib ”和“mfcexpenddll.dll ”两个文件。我们用 Visual Studio 自带的Depends工具可以查看这个.dll ,发现其导出了众多符号(见图15)。Entry PointOrdinalHintFunction(0x0001)0(OxOQOD)?OCSXExittonEgKEXZ0x00001028(0x0002)1(OxOQO H? 1 CSXBxit t oriMUAE 值起0x00001023(0x0003)2(DjeOOO?)?_7CSXEutton6S0x0001509

16、8(0x0013)16QxOD12)?_GetB«eMeES4geMapCS(EuttOniaWBUAPX_HSGMAP(5tZ0x00001050(0x0014)19(0x0013)?_nessae«EntrlasCSXButton30QEUAFI_nSGHAP_EHTRYQM0x00015076©k0004)300x0003)?CheckPoi ntForCent er i n魄CSXBut t onAAEXAAVCF oi0x00001014©k0005)4©k0004)?Dr awlt emCSSBut t oneUAEXPAUt工 T

17、EMSTRUT T®® 囱0x00001341gOOOB)5(MDS)?GetM&SsageMapCSJIButtonNIBEPBUAFX_MSGMAPa(aKZ0x00001073(XhtODOT)6COxOOOB工 mag 述 CSX Butt onQAEHXZ0x0000107D(0x0015)印(0x0014)?m 门孱肥函 apSCSXEut t。皿 WAf XJ1SGW AP 典 B0x00015070Ohcoooa)TCOxOOOT)?Ke dr 也, CSKEu t 七。通 AA£XX 工OkOOOOIOIB(Dwom)8©iOO

18、M)VSetEitm apRCSXBut t oit 典域 MIKU明0«00001337(OsOQOA)90x0009)?SetB i tm apC omm。他 CSXBut t ?nJQ 岫£町 HHKH0Z0x00001068(OrOOQB)10(QsOQOA)?S e IC ol cr T ibQCSIt ul t ?neQQAEXKZOxOOOQ103C(OxOOOCj11(QkOOOB)?S e tD efaul tBut t crJCSXBxit t t)nQAEJOtZ0x0000105F(OxOQOD)12(OteOQOC)Setl coniaCSXBut

19、 toi0Q AEHTMHS20x00001055(OxOOOE)13(OxOOOB)TSrlm 幅面 ffmtgCS 工 Butt。通蚂 AEHH画0x00001046(CxOOOF)14(OxOOOE)?SetImaeePos©CSXButtoniaeQAE?AVCFoiiitia¥2(azOxODOOlOlE(0x0010)15(OxOOOP)?S e tM aske dB i tm apGCSXBut t onQ AEKIHHH3Z0x00001OEA(0x0011)16(0x0010)?SetT &KtO ffstCSXButtorJQAEHH)3ZUxO

20、uooiazD(0x0012)17(0x0011)?SetT extF sfaCSXEuttoniaeQAEAYCFfii nt®V2®020x00001064一2 3 4567 8 99 o 1 0-12345678 1 2 2 111111111 回回国回回回国回回回回回回回回回回ra回图15导出类时导出的大量符号这些都是类的构造函数、析构函数及其它成员函数和变量经编译器处理过的符号,直接用_declspec(dllexport)语句声明类就导出了这些符号。我们.map 文件,查询.map文件的符号,然后将其导出。如图16,打开DLL工程的settings选项,如果我们

21、想用.lib文件导出这些符号,是非常困难的,我们需要在工程中生成再选择Link ,勾选其中的产生 MA双件(Generate mapfile )就可以产生.map文件了。打开mfcexpenddll工程生成的.map文件,我们发现其中包含了图15中所示的符号0001:00000380(symbol )?HasImageCSXButtonQAEHXZ 10001380 f i SXBUTTON.OBJ0001:000003d0?0CSXButtonQAEXZ100013d0 f SXBUTTON.OBJ0001:000005000001:00000570?_GCSXButtonUAEPAXIZ?

22、_ECSXButtonUAEPAXIZ10001500 f i SXBUTTON.OBJ 10001570 f i SXBUTTON.OBJ0001:00000630?1CSXButtonUAEXZ10001630 f SXBUTTON.OBJ0001:00000700 ?_GetBaseMessageMapCSXButtonKGPBUAFX_MSGMAPXZ 10001700 f SXBUTTON.OBJ 0001:00000730 ?GetMessageMapCSXButtonMBEPBUAFX_MSGMAPXZ10001730 f SXBUTTON.OBJ0001:00000770?Re

23、drawCSXButtonAAEXXZ10001770 f i SXBUTTON.OBJ0001:000007d0SXBUTTON.OBJ?SetIconCSXButtonQAEHIHHZ 100017d0 f ./省略图16产生.map文件所以,对于 MFCT展DLL,我们不宜以.lib 文件导出类。6.2 MFC扩展DLL的调用在DLL所在工作区新增一个 dllcall 工程,它是一个基于对话框的MFCEXE程序。在其中增加两个按钮 SXBUTTON1SXBUTTON2并设置其属性为« Owner draw”,如图 17。图17设置按钮属性为"Owner draw&qu

24、ot;在工程中添加两个 ICON资源:IDI_MSN_ICON(MSN141图标)、IDI_REFBAR_ICON Windows的系统图标)。修改工程的“ calldllDlg.h ”头文件为:#include ".mfcexpenddllSXBUTTON.h"#pragma comment(lib,"mfcexpenddll.lib")/包含dll的导出类头文件/隐式链接dll/ CCalldllDlg dialogclass CCalldllDlg : public CDialog/ Constructionpublic:CCalldllDlg(C

25、Wnd* pParent = NULL); standard constructor/ Dialog DataAFX_DATA(CCalldllDlg)enum IDD = IDD_CALLDLL_DIALOG ;/增加与两个按钮对应的成员变量CSXButton m_button1;CSXButton m_button2; 同时,修改"calldllDlg.cpp ”文件,使得 m_button1、m_button2成员变量与对话框上的按钮控件建立关联:void CCalldllDlg:DoDataExchange(CDataExchange* pDX) CDialog:DoData

26、Exchange(pDX);AFX_DATA_MAP(CCalldllDlg)DDX_Control(pDX, IDC_BUTTON2, m_button2);DDX_Control(pDX, IDC_BUTTON1, m_button1);/AFX_DATA_MAP修改 BOOLCCalldllDlg:OnInitDialog()函数,在其中增加对两个按钮设置ICON的代码:BOOL CCalldllDlg:OnInitDialog()CDialog:OnInitDialog();/ Add "About." menu item to system menu. IDM_A

27、BOUTBOX 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(IDS_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 not

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论