在MFC DLL中有三种项目类型:使用共享MFC DLL的常规DLL、MFC扩展DLL、静态链接MFC的常规DLL。其中“MFC扩展DLL”主要针对MFC项目而提供DLL接口的,其作用可以生成普通的类,MFC包括界面的资源即对话框也可以被生成DLL文件供给主调用者程序使用。
MFC扩展DLL的使用步骤:
1.如果单纯建立MFC项目,就使用MFC扩展DLL项目就好。
2.接口使用:提供DLL头文件(包含要使用的函数等)、DLL文件、lib文件给主调用方。(2)若要整个程序调用dll函数都有作用,就在stdafx.h头文件添加“#include "xx.h"的dll头文件”、“#pragma comment(lib,"xx.lib")”。
3.而对于有资源的DLL项目,意思是包含对话框资源的MFC扩展DLL,开发者在其主调用方要使用的DLLL头文件不要include有资源ID的文件,比如DLL项目的对话框类,否则就会报出“某某ID未定义标识符”。
解决问题的方式有三种:
(1)开发者使用普通类(即没有资源并且不是MFC的类,指没有包含对话框类),不要在普通类头文件引用资源类文件,而应在普通类的源文件进行包含资源类,然后在源文件对资源类进行创建对象并初始化。
在DLL项目要导出的类头文件:
//这是个普通类的文件,并没有包含资源的类
#include "Control.h"//需要在主调用方的项目添加该头文件
#pragma once
class AFX_EXT_CLASS CUseLoginDll
{
public:
CUseLoginDll(void);
~CUseLoginDll(void);
void ShowLoginDlg();
public:
CControl CCtrlPtr;
};
在DLL项目要导出的类源文件:
#include "StdAfx.h"
#include "UseLoginDll.h"
#include "LoginDlg.h"//在这里可以引用有资源的类
CUseLoginDll::CUseLoginDll(void)
{
CCtrlPtr=new CControl();
}
CUseLoginDll::~CUseLoginDll(void)
{
CCtrlPtr=NULL;
}
void CUseLoginDll::ShowLoginDlg()//在这里创建DLL项目里的对话框
{
CLoginDlg d;
d.DoModal(CCtrlPtr);
}
主调用方引用的代码示例:
//假设UserLoginDll.h是DLL项目自定义的普通类。
//在TestDlg源文件添加#include "UserLoginDll.h",表示引用UseLoginDll.h
//在TestDlg源文件添加全局变量:CUserLoginDll login;
///
#include "UserLoginDll.h"
CUserLoginDll login;
void TestDlg::Onclick()
{
HINSTANCE exe_hInstance = GetModuleHandle(NULL);//用对象保存主调用者的句柄