MFC程序调用MFC扩展DLL
来源:互联网 发布:联通3g是什么网络制式 编辑:程序博客网 时间:2024/04/30 03:37
一、MFC DLL简介:
MFC创建dll有三种方式:
1、Regular DLL with MFC statically linked:常规静态链接库
2、Regular DLL using shared MFC DLL :常规动态链接库
3、MFC Extension DLL (using shared MFC DLL):扩展的MFC DLL。
MFC扩展DLL与MFC规则DLL的相同点在于在两种DLL的内部都可以使用MFC类库,其不同点在于MFC扩展DLL与应用程序的接口可以是MFC的。可以有对话框等资源。
MFC规则DLL被MFC向导自动添加了一个CWinApp的对象,而MFC扩展DLL则不包含该对象,它只是被自动添加了DllMain 函数。对于MFC扩展DLL,开发人员必须在DLL的DllMain函数中添加初始化和结束代码。
使用MFC向导生成MFC扩展DLL时,系统会自动添加如下代码:
static AFX_EXTENSION_MODULE ExtDllDLL = { NULL, NULL };extern "C" int APIENTRYDllMain( HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved ){ // Remove this if you use lpReserved UNREFERENCED_PARAMETER( lpReserved ); //说明:lpReserved是一个被系统所保留的参数,对于隐式链接是一个非零值,对于显式链接值是零 if (dwReason == DLL_PROCESS_ATTACH) { TRACE0( "EXTDLL.DLL Initializing!\n" ); // Extension DLL one-time initialization if ( !AfxInitExtensionModule( ExtDllDLL, hInstance )) return 0; // Insert this DLL into the resource chain new CDynLinkLibrary( ExtDllDLL ); } else if (dwReason == DLL_PROCESS_DETACH) { TRACE0( "EXTDLL.DLL Terminating!\n" ); // Terminate the library before destructors are called AfxTermExtensionModule( ExtDllDLL ); } return 1; // ok}
1、上述代码完成MFC扩展DLL的初始化和终止处理;
2、初始化期间所创建的 CDynLinkLibrary 对象使MFC扩展 DLL 可以将 DLL中的CRuntimeClass 对象或资源导出到应用程序;
3、AfxInitExtensionModule函数捕获模块的CRuntimeClass 结构和在创建 CDynLinkLibrary 对象时使用的对象工厂(COleObjectFactory 对象);
4、AfxTermExtensionModule函数使 MFC 得以在每个进程与扩展 DLL 分离时(进程退出或使用AfxFreeLibrary卸载DLL时)清除扩展 DLL;
5、第一条语句static AFX_EXTENSION_MODULE ExtDllDLL = { NULL, NULL };定义了一个AFX_EXTENSION_MODULE类的静态全局对象,AFX_EXTENSION_MODULE的定义如下:
struct AFX_EXTENSION_MODULE{ BOOL bInitialized; HMODULE hModule; HMODULE hResource; CRuntimeClass* pFirstSharedClass; COleObjectFactory* pFirstSharedFactory;};
二、创建扩展MFC DLL
vc6.0新建工程 MFC Appwizard(dll) biaodingdll,点击确定,选择MFC扩展DLL,点击完成。新创建一个对话框 IDD_outerpara,类名为COuterPara
然后在类头文件里代码如下:
class AFX_EXT_CLASS COuterPara : public CDialog{// Constructionpublic: COuterPara(CWnd* pParent = NULL); // standard constructor// Dialog Data //{{AFX_DATA(COuterPara) enum { IDD = IDD_outerpara }; // NOTE: the ClassWizard will add data members here //}}AFX_DATA// Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(COuterPara) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL// Implementationprotected:
有两处要注意修改:
1.在class后面加上AFX_EXT_CLASS,其定义如下:
#ifdef _AFXEXT AFX_CLASS_EXPORT#else AFX_CLASS_IMPORT
2.在stdafx.h 里加上#include "resource.h"
否则可能编译会出现IDD = IDD_outerpara 未声明错误。
然后添加其他成员变量和函数。编译连接生成dll和lib文件
三、调用扩展的 DLL
将OuterPara.h、biaodingdll.dll、biaodingdll.lib文件复制到调用程序的目录中。添加#include “OuterPara.h”
;往工程-设置-连接库模块和工程选项中添加ExportClass.lib 或者添加#pragma comment(lib,"MyDll.lib")
然后编译出现 IDD_outerpara没有声明错误
!!!解决方法,修改调用工程的resource文件,将dll工程的id复制过来。
然后调用dll程序
OuterPara para;if(para.DoModal()){...}
- MFC程序调用MFC扩展DLL
- ATL 调用MFC扩展dll
- DLL编写+MFC调用程序
- [原创]非MFC程序如何调用MFC扩展DLL之最简单方法
- 调用mfc扩展型dll使用对话框
- MFC扩展dll
- 深入MFC扩展DLL
- MFC扩展DLL编程
- MFC扩展DLL
- MFC扩展DLL 小结
- 深入MFC扩展DLL
- MFC扩展DLL
- MFC "扩展DLL" 制作
- MFC程序调用Dll中的对话框资源
- MFC--Extension DLL(扩展DLL)
- MFC--Extension DLL(扩展DLL)
- VC++:创建,调用MFC动态链接库(扩展DLL)
- MFC扩展DLL中调用Windows Media Player
- Linux
- POJ 3009 Curling 2.0
- ubuntu14.04下安装git
- noi.openjudge 7834题解 分成互质组(分层递归)
- HDU 3791
- MFC程序调用MFC扩展DLL
- hjr教程-Python(一):环境搭建与入门知识
- C语言入门级教程五
- [uboot]uboot下载地址
- python pjsua2-1:注册代码
- handler机制及其使用
- Demo03__int型
- HTTP中application/x-www-form-urlencoded字符说明
- data:image/png;base64是什么