您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > VC++程序设计-MFC动态链接库
VC++程序设计第14讲—静态/动态链接库22004/11/307.4MFC动态链接库7.4.1MFC动态链接库概述•MFC动态链接库特点可以使用MFC类库需要MFC的初始化(利用工具可以避免)•MFC动态链接库类型MFC常规动态链接库MFC扩展动态链接库•两种MFC动态链接库的区别导出能力,使用MFC类库的方式7.4MFC动态链接库MFC常规动态链接库MFC扩展动态链接库导出能力•导出C风格函数和全局变量•导出资源•导出C风格函数和全局变量•导出资源•导出基于MFC的C++类、成员函数使用MFC类库的方式•静态或动态连接MFC类库•动态连接MFC类库•要求客户程序和动态链接库使用的MFC类库版本相同7.4.1MFC动态链接库概述•两种MFC动态链接库的区别7.4MFC动态链接库7.4.2MFC常规动态链接库示例•示例要求创建MFC常规动态链接库导出C风格函数使用MFC类库测试动态链接库•创建MFC常规链接库框架用AppWizard创建MFC类型动态链接库工程设置库选项7.4MFC动态链接库7.4.2MFC常规动态链接库示例7.4MFC动态链接库7.4.2MFC常规动态链接库示例7.4MFC动态链接库7.4.2MFC常规动态链接库示例•查看MFC常规链接库框架代码应用程序主类CMFCRgDllApp头文件classCMFCRgDllApp:publicCWinApp{public:CMFCRgDllApp();//…DECLARE_MESSAGE_MAP()};7.4MFC动态链接库7.4.2MFC常规动态链接库示例•查看MFC常规链接库框架代码应用程序主类CMFCRgDllApp源文件/*使用MFC类库的示例:externCBOOLPASCALEXPORTExportedFunction(){AFX_MANAGE_STATE(AfxGetStaticModuleState());//函数体}*/CMFCRgDllApp::CMFCRgDllApp(){}//TheoneandonlyCMFCRgDllAppobjectCMFCRgDllApptheApp;7.4MFC动态链接库7.4.2MFC常规动态链接库示例•查看MFC常规链接库框架代码关于AFX_MANAGE_STATE•AFX_MANAGE_STATE(AFX_MODULE_STATE*pModuleState)•用于模块切换时的状态保护–pModuleState指向切换前的模块状态–当前函数结束后原模块的状态自动被恢复–用于DLL中调用MFC函数、类、资源时的模块状态切换当前模块状态压栈当前模块状态出栈MFC调用7.4MFC动态链接库7.4.2MFC常规动态链接库示例•增加导出函数添加导出函数的头文件添加导出函数的源文件添加宏定义MFCRGDLL_EXPORTS•用于头文件复用•编译生成动态链接库7.4MFC动态链接库#ifndef_RGDLLAPIS_H#define_RGDLLAPIS_H#ifdefMFCRGDLL_EXPORTS#defineMFCRGDLL_API__declspec(dllexport)#else#defineMFCRGDLL_API__declspec(dllimport)#endifexternC{MFCRGDLL_APIvoidShowMessage(intseq,char*msg);}#endif7.4MFC动态链接库#includestdafx.h#includeRgDllAPIs.hvoidShowMessage(intseq,constchar*msg){AFX_MANAGE_STATE(AfxGetStaticModuleState());CStringstrMsg;strMsg.Format(%d:%s,seq,msg);AfxMessageBox(strMsg);}7.4MFC动态链接库7.4MFC动态链接库7.4.2MFC常规动态链接库示例•生成测试工程创建基于对话框的工程MFCRgDllTest修改对话框资源模板数值调节按钮控件7.4MFC动态链接库7.4.2MFC常规动态链接库示例•生成测试工程使用数值调节按钮控件•数值调节钮控件提供一对箭头键,用户可以单击它们来调整数值。•该数值称为当前位置。该位置保持在数值调节钮范围内。•当用户单击上箭头键,该位置移向最大值;当用户单击下箭头键,该位置移向最小值。•数值调节按钮控件在MFC中由类CSpinButtonCtrl表示。7.4MFC动态链接库7.4.2MFC常规动态链接库示例•生成测试工程使用数值调节按钮控件•数值调节按钮控件通常有一个伙伴控件(buddycontrol),用来显示当前数值。•数值调节按钮控件所对应的伙伴控件可以在程序运行时指定,也可以在设计时指定指定了该选项后SpinButtong会自动和前一个控件(按TAB顺序排序)形成伙伴关系7.4MFC动态链接库7.4.2MFC常规动态链接库示例•生成测试工程使用数值调节按钮控件•对话框模板的TAB顺序7.4MFC动态链接库7.4.2MFC常规动态链接库示例•生成测试工程使用数值调节按钮控件•基数获取/设置数值基数(10或16)。GetBase/SetBase。•伙伴窗口获取/设置伙伴窗口。GetBuddy/SetBuddy。•位置获取/设置当前位置。GetPos/SetPos。•范围获取/设置数值调节范围。默认情况下,最大值设置为0,最小值设置为100。由于默认最大值小于默认最小值,所以箭头按钮的操作正好与直觉相反。GetRange/SetRange。7.4MFC动态链接库7.4.2MFC常规动态链接库示例•生成测试工程添加对话框控件成员变量•序号控件添加int类型成员变量•标题和消息添加CString类型成员变量•SpinButton控件添加CSpinButtonCtrl类型变量classCMFCRgDllTestDlg:publicCdialog{CSpinButtonCtrlm_SeqSpinCtrl;intm_nSeq;CStringm_strTitle;CStringm_strMsg;}7.4MFC动态链接库7.4.2MFC常规动态链接库示例•生成测试工程初始化成员变量CMFCRgDllTestDlg::CMFCRgDllTestDlg(CWnd*pParent/*=NULL*/):CDialog(CMFCRgDllTestDlg::IDD,pParent){m_nSeq=0;m_strTitle=_T();m_strMsg=_T();}BOOLCMFCRgDllTestDlg::OnInitDialog(){//…m_SeqSpinCtrl.SetRange(0,100);returnTRUE;}7.4MFC动态链接库7.4.2MFC常规动态链接库示例•生成测试工程使用动态链接库•拷贝MFCRgDll.h,MFCRgDll.lib,MFCRgDll.dll•在工程中引用动态链接库的导入库•在程序中包含头文件•在“显示消息”按钮的点击事件中使用导入函数7.4MFC动态链接库7.4.2MFC常规动态链接库示例7.4MFC动态链接库7.4.2MFC常规动态链接库示例#includeRgDllAPIs.h“voidCMFCRgDllTestDlg::OnButtonShow(){UpdateData();ShowMessage(m_nSeq,m_strMsg);}7.4MFC动态链接库7.4.3MFC扩展动态链接库示例•示例要求创建MFC扩展动态链接库导出基于MFC的类导出资源测试动态链接库•创建MFC常规链接库框架用AppWizard创建MFC类型动态链接库工程设置库选项7.4MFC动态链接库7.4.3MFC扩展动态链接库示例7.4MFC动态链接库7.4.2MFC扩展动态链接库示例7.4MFC动态链接库7.4.2MFC常规动态链接库示例•查看MFC常规链接库框架代码Workspace中的文件•MFCExtDll.cpp–定义DLL的初始化入口•MFCExtDll.rc,Resource.h–包含DLL的资源•MFCExtDll.def–模块定义文件•Stdafx.h,stdafx.cpp–预编译文件staticAFX_EXTENSION_MODULEMFCExtDllDLL={NULL,NULL};externCintAPIENTRYDllMain(HINSTANCEhInstance,DWORDdwReason,LPVOIDlpReserved){UNREFERENCED_PARAMETER(lpReserved);if(dwReason==DLL_PROCESS_ATTACH){TRACE0(MFCEXTDLL.DLLInitializing!\n);//ExtensionDLLone-timeinitializationif(!AfxInitExtensionModule(MFCExtDllDLL,hInstance))return0;newCDynLinkLibrary(MFCExtDllDLL);}elseif(dwReason==DLL_PROCESS_DETACH){TRACE0(MFCEXTDLL.DLLTerminating!\n);//TerminatethelibrarybeforedestructorsarecalledAfxTermExtensionModule(MFCExtDllDLL);}return1;}7.4MFC动态链接库7.4.2MFC常规动态链接库示例•查看MFC常规链接库框架代码Workspace中的文件•MFCExtDll.def–模块定义(.def)文件为链接器提供有关被链接程序的导出、属性及其他方面的信息,通常使用__declspec(dllexport)从DLL导出LIBRARYMFCExtDllDESCRIPTION'MFCExtDllWindowsDynamicLinkLibrary'EXPORTS;NGConnect@17.4MFC动态链接库7.4.2MFC常规动态链接库示例•导出类和资源导出基于CDialog的对话框类•添加对话框资源,并修改对话框资源模板7.4MFC动态链接库7.4.2MFC常规动态链接库示例•导出类和资源导出基于CDialog的对话框类•用类向导生成新的对话框类CCalcDialog•添加成员变量•添加按钮点击响应函数•修改类定义为导出类#defineIDD_DIALOG_CALCULATOR1000classAFX_EXT_CLASSCCalcDialog:publicCDialog{public:CCalcDialog(CWnd*pParent=NULL);//DialogDataenum{IDD=IDD_DIALOG_CALCULATOR};doublem_dNum1;doublem_dNum2;CStringm_strResult;intm_nOperator;//Overridesprotected:virtualvoidDoDataExchange(CDataExchange*pDX);//Implementationprotected:afx_msgvoidOnButtonCalculate();afx_msgvoidOnButtonClear();DECLARE_MESSAGE_MAP()};生成DLL的程序用来导出类定义使用DLL的程序用来导入类定义voidCCalcDialog::OnButtonCalculate(){UpdateData();doubleresult=0.0;switch(m_nOperator){case0://Addbreak;case1://subbreak;case2://multibreak;case3://divbreak;}m_strResult.Format(%lf,result)
本文标题:VC++程序设计-MFC动态链接库
链接地址:https://www.777doc.com/doc-3383001 .html