这类问题的出现主要在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下关于“建立空文档失败”问题的分析的更多相关文章

  1. win8下hosts保存文档失败,提示:请检查文件是否被另一个应用程序打开

    选择文件,然后右键点击属性,然后进入"安全"选项卡下点击当前用户对用的用户名然后编辑权限,给予完全控制的权限. 如图: 图一:

  2. VS2010/MFC编程入门之二(利用MFC向导生成单文档应用程序框架)

    VS2010/MFC编程入门之二(利用MFC向导生成单文档应用程序框架)-软件开发-鸡啄米 http://www.jizhuomi.com/software/141.html   上一讲中讲了VS20 ...

  3. 在c++MFC下用PCL显示操作点云文件 MFC对话框显示操作PCL点云

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/13115873.html 第一步 下载PCL库  我的版本是1.8.1的 你都要MFC下跑PCL ...

  4. MFC下OpenGL入门(可以用)

    MFC下OpenGL入门 源文件 1, 建一工程文件,我这里命名为first,现在first工程里面我们没有添加任何东西,所有的东西都是MFC自动帮我们创建的. 2, 添加链接库.这一步很关键.打开菜 ...

  5. [Sciter系列] MFC下的Sciter–3.Sciter脚本与底层交互

    [Sciter系列] MFC下的Sciter–3.Sciter脚本与底层交互,脚本调用底层自定义的方法函数. 本系列文章的目的就是一步步构建出一个功能可用,接口基本完善的基于MFC框架的SciterF ...

  6. [Sciter系列] MFC下的Sciter–2.Sciter中的事件,tiscript,语法

    [Sciter系列] MFC下的Sciter–2.Sciter中的事件,tiscript,CSS部分自觉学习,重点说明Tiscript部分的常见语法和事件用法. 本系列文章的目的就是一步步构建出一个功 ...

  7. MFC下DLL编程(图解)

    MFC下DLL编程(图解) DLL(Dynamic Link Library,动态链接库)是微软公司为Windows和OS/2操作系统设计一种供应用程序在运行时调用的共享函数库.DLL是应用程序的一种 ...

  8. MFC下对串口的操作以及定时器的调用

    最近研究了一下MFC下对串口的操作,测试了一下对设备的读写. 1.打开串口 GetDlgItem(IDC_BUTTON_OPEN)->EnableWindow(FALSE); m_hComm = ...

  9. Step by Step: 基于MFC下的COM组件开发-Helloworld

    http://blog.csdn.net/sybifei/article/details/45008745 [这篇文章有问题, 仅供参考] http://blog.csdn.net/define_us ...

随机推荐

  1. Springmvx拦截html出现406解决以及Server Tomcat v8.0 Server at localhost failed to start 问题解决方法

    问题是这样的:环境是SSM框架,在配置好的框架里想请求一个html,结果406了,406就是HTTP协议状态码的一种,表示无法使用请求的特性来响应请求的网页.一般指客户端浏览器不接受所请求页面的MIM ...

  2. Oracle总结之plsql编程(基础七)

    紧接基础六,对oracle角色和权限的管理之后,在接下来的几次总结中来就最近工作中用过的plsql编程方面的知识进行总结,和大家分享! 原创作品,转自请注明出处:https://www.cnblogs ...

  3. Mybatis逆向生成代碼

    Idea 单模块 1.在pom.xml中添加依赖 <build> <plugins> <plugin> <groupId>org.mybatis.gen ...

  4. HDU4162(最小循环表示)

    Shape Number Time Limit: 24000/12000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  5. phpadmin登录报错:#1045 - Access denied for user 'root'@'localhost' (using password: yes)

    原因:phpmyadmin无法通过root+密码联系mysql; 解决方法:重置mysql密码. 步骤: 1.cmd 2.登录MySQL:mysql -uroot -p    ->root是用户 ...

  6. 高性能JavaScript(数据存取)

    数据存取分为4各部分 存取位置 作用域及改变作用域 原型以及原型链 缓存对象成员值 存取位置 JavaScript 有4中基本的数据存取位置 字面量:字面量代表自身,不存于特定的位置.比如这个的匿名函 ...

  7. C#取得控制台应用程序的根目录方法 判断文件夹是否存在,不存在就创建

    取得控制台应用程序的根目录方法1:Environment.CurrentDirectory 取得或设置当前工作目录的完整限定路径2:AppDomain.CurrentDomain.BaseDirect ...

  8. Python+Selenium笔记(二):配置谷歌+IE环境

    #有的时候可能要访问外国的网站下载资料或工具,这时可能出现各种问题,例如谷歌人机验证显示不了.网站打不开等,建议使用一个FQ软件 (一)  设置IE (1)   http://docs.seleniu ...

  9. markdown简单常用语法

    一.标题(符号要和文字之间加上一个字符的空格)# 一级标题## 二级标题### 三级标题#### 四级标题##### 五级标题###### 六级标题二.列表(符号要和文字之间加上一个字符的空格)有序列 ...

  10. jsp 发布war 包到Tomcat

    1.将项目打包成war,打包过程这里不做赘述 2.在linux或者windows下安装xmapp 3.打开Tomcat下conf/server.xml,在host下添加一行        <Co ...