您的位置:首页 > 其它

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扩展dll