一、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())
{
...
}