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()){...}
0 0
原创粉丝点击