事件回放:
1、在MFC下编写的.exe可执行程序在打包的时候由于在未安装vc编译器或微软软件运行环境vcredistx86.exe下无法运行,总是报错说是什么什么并行环境配置有错,程序无法运行等类似的错误提示,解决这一问题最好的方法就是将程序设置为: USE MFC IN A STATIC LIBRARY.
但是一旦将程序设置为如此后,就会出现error C2039: classCMenuDlg : is not a member of CMenuDlg。
2、在做一个视图分割的例子,自己用基于CSplitterWnd编写的一个自定义类;
当利用成员函数创建视图时:
m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CMenuDlg),CSize(100,735),pContext)
提示错误如下:error C2039: classCMenuDlg : is not a member of CMenuDlg
问题分析:
看到这种错误,我们的第一反应是没有包含头文件,没错的有两种情况:
(1)没有在MainFrame头文件没有包含CMenuDlg的头文件,只要包含即可;
(2)当你发现已经包含了头文件还是出错,那就属于第二种情况了,我根据自己查找的资料得到:
CDialog类创建时默认是不支持动态创建,而MFC为了使类支持动态创建,设计了一套用宏来实现的动态创建机制,在这套宏中,定义了class+类名的数据成员,也就是你这里的classCMenuDlg,只有支持动态创建的类,才有这些数据成员和相应的操作。而CDialog类是不支持的。因此错误提示中就有classCMenuDlg未定义的提示。
解决办法:
在CMenuDlg类的头文件添加一句即可,添加后为:
class CMenuDlg : public CDialog
{
// Construction
public:
CMenuDlg(CWnd* pParent = NULL); // standard constructor
DECLARE_DYNCREATE(CMenuDlg) //允许动态创建,默认是不允许的
添加完就可以了,可是我发现问题还没有结束,又来了一个错误提示(类似的,当时忘记截图):
ZLLK.obj : error LNK2001: unresolved external symbol "public: static struct CRuntimeClass const CZLLKDoc::classCZLLKDoc" (?classCZLLKDoc@CZLLKDoc@@2UCRuntimeClass@@B)
这下又蒙了,继续百度,终于解决了,这里直接给出解决方案(具体的原理推荐阅读侯捷老师的《MFC深入浅出》的动态创建机制,方法如下:在CMenuDlg类的实现cpp文件前面添加以下语句(记住不是在内部)
IMPLEMENT_DYNCREATE(CMenuDlg, CDialog)
ok,至此2个问题都解决了,希望对你有帮助。