[转]MFC下关于“建立空文档失败”问题的分析
这类问题的出现主要在bool CWinApp::ProcessShellCommand(CCommandLineInfo& rCmdInfo);
函数的关键内容:
BOOL bResult = TRUE;
switch (rCmdInfo.m_nShellCommand)
{
case CCommandLineInfo::FileNew: // 新建
if (!AfxGetApp()->OnCmdMsg(ID_FILE_NEW, 0, NULL, NULL))
OnFileNew();
if (m_pMainWnd == NULL)
3&'
bResult = FALSE;
break;
case CCommandLineInfo::FileOpen:
if (!OpenDocumentFile(rCmdInfo.m_strFileName))
bResult = FALSE;
break;
通过上面的内容我们可以看出:如果没有对ID_FILE_NEW做映射的话出现问题就在OnFileNew();
CWinApp对OnFileNew的默认实现是调用m_pDocManager->OnFileNew();
我们继续解析cdocmanager,它究竟干了些什么?
(首先说明一下CDocManager它主要的功能是帮助CWinApp是管理文档模板链表和注册文件类型.)
//如果模板列表为空的话
if (m_templateList.IsEmpty())
{
q
TRACE0("Error: no document templates registered with CWinApp.
");
AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC); //报错并返回.这里不会报建立新文档出错。
return;
}
cdoctemplate* pTemplate = (CDocTemplate*)m_templateList.GetHead();
if (m_templateList.GetCount() > 1)
{
// more than one document template to choose from
// bring up dialog prompting user
CNewTypeDlg dlg(&m_templateList);
int nID = dlg.DoModal();
if (nID == IDOK)
pTemplate = dlg.m_pSelectedTemplate;Mj8F
else
return; // none - cancel operation
w
}
assert(ptemplate != NULL);
]kW
ASSERT_KINDOF(CDocTemplate, pTemplate);
ptemplate->opendocumentfile(null);
通过上面的代码我们可以看出,cwinapp的onfilenew和onfileopen分别调用cdocmanager的虚拟函数onfilenew和onfileopen。而在cdocmanager里面。通过模板链表选择不同的模板来调用文档模板的opendocumentfile();
如果传入参数NULL表示新建文件。
下面我们来看看cdoctemplate::opendocumentfile()它是一个最关键的函数。因为他是虚拟函数,我们考虑CSingleDocTemplate::OpenDocumentFile的情况。
4RqL=
这个函数里面有一段代码:
其中:AFX_IDP_FAILED_TO_CREATE_DOC 就是字符“建立空文档失败”的资源id
// create a new document
pDocument = CreateNewDocument();
ASSERT(pFrame == NULL); // will be created below
bCreated = TRUE;
if (pDocument == NULL)N+
{
AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC);
return NULL;
}
ASSERT(pDocument == m_pOnlyDoc);?#Z
if (pFrame == NULL)
{
ASSERT(bCreated);
// create frame - set as main document frame
@(m`w
BOOL bAutoDelete = pDocument->m_bAutoDelete;
pDocument->m_bAutoDelete = FALSE;
// don’t destroy if something goes wrong
pFrame = CreateNewFrame(pDocument, NULL);
pDocument->m_bAutoDelete = bAutoDelete;1nD{WwQ
if (pFrame == NULL)
{
AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC);
delete pDocument; // explicit delete on error
return NULL;
}
通过观察上面的代码我们很容易的看出有两个可能出错的原因:1 CreateNewDocument返回为NULL 2 createnewframe 返回为空。
先看 CreateNewDocument() 一般来说这个函数很少失败。不过在调试时也不能掉以轻心。
6GYC
>'@
再看看CreateNewFrame() 里面有一个函数LoadFrame是造成这种“建立新文档失败”错误的源泉所在。
只要它返回False就会弹出这样的提示。
我们在来看看LoadFrame() 里面调用CFrameWnd::Create()来创建窗口,创建窗口失败返回Fasle。
这样问题就变的比较简单了。
看看create和createex函数的动作就知道怎么回事了。
[V:!R
****************************************************************S_zS
1如果找不到菜单资源返回False 同时也弹出“建立空文档失败”
HINSTANCE hInst = AfxFindResourceHandle(lpszMenuName, RT_MENU);
if ((hMenu = ::LoadMenu(hInst, lpszMenuName)) == NULL)
{
TRACE0("Warning: failed to load menu for CFrameWnd.
");
PostNcDestroy(); // perhaps delete the C++ object
return FALSE;
}
2重载了PreCreateWindow而且返回False也会导致弹出“建立空文档失败”
3在OnCreate 里面返回-1 也会导致弹出“建立空文档失败”。
******************************************************************
以上就是我分析的出现这样“建立空文档失败”问题的大致原因。也许还有其他的原因。我这里就不一一列举了。
[转]MFC下关于“建立空文档失败”问题的分析的更多相关文章
- win8下hosts保存文档失败,提示:请检查文件是否被另一个应用程序打开
选择文件,然后右键点击属性,然后进入"安全"选项卡下点击当前用户对用的用户名然后编辑权限,给予完全控制的权限. 如图: 图一:
- VS2010/MFC编程入门之二(利用MFC向导生成单文档应用程序框架)
VS2010/MFC编程入门之二(利用MFC向导生成单文档应用程序框架)-软件开发-鸡啄米 http://www.jizhuomi.com/software/141.html 上一讲中讲了VS20 ...
- 在c++MFC下用PCL显示操作点云文件 MFC对话框显示操作PCL点云
原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/13115873.html 第一步 下载PCL库 我的版本是1.8.1的 你都要MFC下跑PCL ...
- MFC下OpenGL入门(可以用)
MFC下OpenGL入门 源文件 1, 建一工程文件,我这里命名为first,现在first工程里面我们没有添加任何东西,所有的东西都是MFC自动帮我们创建的. 2, 添加链接库.这一步很关键.打开菜 ...
- [Sciter系列] MFC下的Sciter–3.Sciter脚本与底层交互
[Sciter系列] MFC下的Sciter–3.Sciter脚本与底层交互,脚本调用底层自定义的方法函数. 本系列文章的目的就是一步步构建出一个功能可用,接口基本完善的基于MFC框架的SciterF ...
- [Sciter系列] MFC下的Sciter–2.Sciter中的事件,tiscript,语法
[Sciter系列] MFC下的Sciter–2.Sciter中的事件,tiscript,CSS部分自觉学习,重点说明Tiscript部分的常见语法和事件用法. 本系列文章的目的就是一步步构建出一个功 ...
- MFC下DLL编程(图解)
MFC下DLL编程(图解) DLL(Dynamic Link Library,动态链接库)是微软公司为Windows和OS/2操作系统设计一种供应用程序在运行时调用的共享函数库.DLL是应用程序的一种 ...
- MFC下对串口的操作以及定时器的调用
最近研究了一下MFC下对串口的操作,测试了一下对设备的读写. 1.打开串口 GetDlgItem(IDC_BUTTON_OPEN)->EnableWindow(FALSE); m_hComm = ...
- Step by Step: 基于MFC下的COM组件开发-Helloworld
http://blog.csdn.net/sybifei/article/details/45008745 [这篇文章有问题, 仅供参考] http://blog.csdn.net/define_us ...
随机推荐
- centos7下没有iptables
从centos7开始使用linux,之前版本的没有深入了解过,今天要开放个端口,需要有防火墙的相关操作,从网上查资料都是编辑/etc/sysconfig目录下面的iptables文件,可我进入这个文件 ...
- XJad反编译工具
XJad反编译工具 我们写的java文件,编译后就会生成相应的字节码文件,也就是.java文件经过编译以后生成.class文件 现在,假设我们现在存在这样一个问题:就是我们想自己动手验证注释会不会被编 ...
- Webpack 常用命令总结以及常用打包压缩方法
前言:Webpack是一款基于node的前端打包工具,它可以将很多静态文件打包起来,自动处理依赖关系后,生成一个.js文件,然后让html来引用,不仅可以做到按需加载,而且可以减少HTTP请求,节约带 ...
- JS实现自定义排序
定义:用本地特定的顺序来比较两个字符串. 语法:stringObject.localeCompare(target) 参数:target——要以本地特定的顺序与 stringObject 进行比较的字 ...
- MySql导出sql语句
sql解释: mysqldump 是mysql的一个专门用于拷贝操作的命令 --opt 操作的意思 --compress 压缩要传输的数据 --skip-lock 忽略锁住的表(加上这句能防止当表有外 ...
- 关于Mysql数据库的知识总结
2017年6月8日,天气阴.心情晴. 连续做梦两个晚上了,昨晚竟然梦见一个很长时间不联系的初中同学了,早上上班的路上聊了聊.女孩现在出差在贵州,风景秀美的地方.我说“你现在生活很滋润”.女孩说“那是你 ...
- 用windows浏览器打开Linux的Jupyter notebook开发、调试示例
1.场景,在windows浏览器中打开Linux环境下的jupyter notebook.Jupyter notebook开启远程服务,Spark.python计算环境在Linux服务器中,而工作环境 ...
- AutoCAD.net-错误消息大全
case Acad::eOk:lstrcpy(Glb_AcadErrorInfo,_T("正确"));break;case Acad::eNotImplementedYet:lst ...
- 【CLR Via C#】16 数组
所有的数组都隐式的从System.Array抽象类派生,后者又派生自System.Object 数组是引用类型,所以会在托管堆上分配内存,数组对象占据的内存块包含数组的元素,一个类型对象指针.一个同步 ...
- AsyncTask POST请求
布局: <?xml version="1.0" encoding="utf-8"?> <android.support.constraint. ...