MFC扩展DLL
准备把自绘Combo Box控件单独封装到DLL类中,尝试使用“使用共享MFC DLL的规则DLL”建立项目,总是无法找到XXX.lib,最终发现应该使用“MFC扩展DLL”类型建立DLL项目。现将过程总结如下:
1. 建立MFC对话框程序:MFC_Test;
2. 在MFC对话框程序解决方案中添加新建项目,建立“MFC扩展DLL”类型的MFC_DllTest项目DLL_Test;
3. 在DLL_Test中添加类——Test,编译器自动建立Test.h、Test.cpp文件,在头文件中,将AFX_EXT_CLASS关键字添加到类的声明中,如下所示:
class AFX_EXT_CLASS Test : public CWnd {...}
(AFX_EXT_CLASS语义参见http://blog.csdn.net/kenkao/article/details/7872644)
4. 自定义函数:在头文件中添加自定义函数声明:
public:
void MyTest();
在源文件中写入定义:
void Test::MyTest()
{
MessageBox(L"Hello!");
}
5. 在MFC_DllTest对话框程序头文件MFC_DllTestDlg.h中添加DLL头文件:
#include "Test.h"
此时编译将出现“Test.h”文件未找到错误,
解决方案:设置MFC_DllTest项目属性
(PS:也可以将这个头文件拷贝到对话框文件夹中)
在MFC_DllTestDlg.h中声明Test类:
public:
Test mTest;
MFC_DllTestDlg.cpp中添加按钮事件
{
mTest.MyTest();
}
编译会出现无法解析外部符号的错误:
error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: virtual __thiscall Test::~Test(void)" (__imp_??1Test@@UAE@XZ)
1>MFC_DllTestDlg.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall Test::Test(void)" (__imp_??0Test@@QAE@XZ),该符号在函数 "public: __thiscall CMFC_DllTestDlg::CMFC_DllTestDlg(class CWnd *)" (??0CMFC_DllTestDlg@@QAE@PAVCWnd@@@Z) 中被引用
解决方案:在对话框项目属性中设置链接器输入附加依赖项
编译生成成功。