MFC程序调用MFC扩展DLL
2016-11-15 10:25
260 查看
一、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 APIENTRY DllMain( 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 { // Construction public: 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 // Implementation protected:
有两处要注意修改:
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之最简单方法
- DLL编写+MFC调用程序
- MFC程序调用Dll中的对话框资源
- MFC扩展dll,在构造函数中加载资源,导致程序exe启动困难。
- 利用opencv编写dll,在另一个MFC程序中调用显示视频,dll可以用于没有装opencv的电脑中
- MFC扩展DLL调用对话框,测试的时候报错问题的解决
- ATL 调用MFC扩展dll
- [VC]MFC程序动态调用plugin DLL的方式
- VC++:创建,调用MFC动态链接库(扩展DLL)
- MFC扩展DLL中调用Windows Media Player
- mfc扩展dll 的调用以及dll中creat出错分析
- mfc扩展dll 的调用以及dll中creat出错分析
- mfc扩展dll的调用以及dll中creat出错分析
- 用MFC写对话框形式的DLL并用程序进行调用方法
- 解决扩展MFC DLL与主程序资源冲突问题
- C#调用MFC程序DLL库——MFC项目DLL生成问题、DLL引用链问题、DLL读取配置文件路径问题
- C#程序实现动态调用DLL的研究
- dll内申请的内存可以由调用它的程序释放吗?
- VC++MFC 调用DLL里的对话框资源
- C#程序实现动态调用DLL的研究