精华内容
下载资源
问答
  • MFC建立空文档失败分析

    千次阅读 2018-09-19 11:39:12
    建立空文档失败"的问题的分析! 许多新手在遇到此类问题时总是措手无策,如果谁有耐心就看看我写的下面这片文章吧。 这类问题的出现主要在BOOL CWinApp::ProcessShellCommand(CCommandLineInfo& ...

    转载自checky_1981:

    关于"建立空文档失败"的问题的分析!

    许多新手在遇到此类问题时总是措手无策,如果谁有耐心就看看我写的下面这片文章吧。

    这类问题的出现主要在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)
    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())
    {
    TRACE0("Error: no document templates registered with CWinApp.\n");
    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;
    else
    return;     // none - cancel operation
    }

    ASSERT(pTemplate != NULL);
    ASSERT_KINDOF(CDocTemplate, pTemplate);

    pTemplate->OpenDocumentFile(NULL);

    通过上面的代码我们可以看出,CWinApp的OnFileNew和OnFileOpen分别调用CDocManager的虚拟函数OnFileNew

    和OnFileOpen。而在CDocManager里面。通过模板链表选择不同的模板来调用文档模板的OpenDocumentFile();
    如果传入参数NULL表示新建文件。

    下面我们来看看CDocTemplate::OpenDocumentFile()它是一个最关键的函数。因为他是虚拟函数,我们考虑
    CSingleDocTemplate::OpenDocumentFile的情况。
    这个函数里面有一段代码:
    其中: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)
    {
    AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC);
    return NULL;
    }
    ASSERT(pDocument == m_pOnlyDoc);
    if (pFrame == NULL)
    {
    ASSERT(bCreated);

    // create frame - set as main document frame
    BOOL bAutoDelete = pDocument->m_bAutoDelete;
    pDocument->m_bAutoDelete = FALSE;
    // don't destroy if something goes wrong
    pFrame = CreateNewFrame(pDocument, NULL);
    pDocument->m_bAutoDelete = bAutoDelete;
    if (pFrame == NULL)
    {
    AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC);
    delete pDocument;       // explicit delete on error
    return NULL;
    }

    通过观察上面的代码我们很容易的看出 有两个可能出错的原因:1 CreateNewDocument返回为NULL 2 

    CreateNewFrame 返回为空。

    先看 CreateNewDocument() 一般来说这个函数很少失败。不过在调试时也不能掉以轻心。
    再看看CreateNewFrame()  里面有一个函数LoadFrame是造成这种“建立新文档失败”错误的源泉所在。
    只要它返回False就会弹出这样的提示。
    我们在来看看LoadFrame() 里面调用CFrameWnd::Create()来创建窗口,创建窗口失败返回Fasle。
    这样问题就变的比较简单了。

    看看Create和CreateEx函数的动作就知道怎么回事了。
    ****************************************************************
    1 如果找不到菜单资源 返回False 同时也弹出“建立空文档失败”
    HINSTANCE hInst = AfxFindResourceHandle(lpszMenuName, RT_MENU);
    if ((hMenu = ::LoadMenu(hInst, lpszMenuName)) == NULL)
    {
    TRACE0("Warning: failed to load menu for CFrameWnd.\n");
    PostNcDestroy();            // perhaps delete the C++ object
    return FALSE;
    }
    2 重载了PreCreateWindow而且返回False也会导致弹出“建立空文档失败”
    3 在OnCreate 里面返回-1 也会导致弹出“建立空文档失败”。
    ******************************************************************

    以上就是我分析的 出现这样“建立空文档失败”问题的大致原因。也许还有其他的原因。我这里就不一一列举

    了。

    说实话遇到此类问题,如果是新手的话,是很难解决的。我写这篇文档就当是抛砖引玉吧。
    我的Email: checky_1981@163.com

    展开全文
  • 建立空文档失败

    千次阅读 2011-11-23 13:03:16
    这类问题的出现主要在bool CWinApp::ProcessShellCommand...2 重载了PreCreateWindow而且返回False也会导致弹出“建立空文档失败”  3 在OnCreate 里面返回-1 也会导致弹出“建立空文档失败”。      

     这类问题的出现主要在bool CWinApp::ProcessShellCommand(CCommandLineInfo& rCmdInfo);

    函数的内容如下(在C:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\src\mfc\appui2.cpp)

    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)
    			bResult = FALSE;
    		break;
    
    		// If we've been asked to open a file, call OpenDocumentFile()
    
    	case CCommandLineInfo::FileOpen:
    		if (!OpenDocumentFile(rCmdInfo.m_strFileName))
    			bResult = FALSE;
    		break;
    
    		// If the user wanted to print, hide our main window and
    		// fire a message to ourselves to start the printing
    
    	case CCommandLineInfo::FilePrintTo:
    	case CCommandLineInfo::FilePrint:
    		m_nCmdShow = SW_HIDE;
    		ASSERT(m_pCmdInfo == NULL);
    		if(OpenDocumentFile(rCmdInfo.m_strFileName))
    		{
    			m_pCmdInfo = &rCmdInfo;
    			ENSURE_VALID(m_pMainWnd);
    			m_pMainWnd->SendMessage(WM_COMMAND, ID_FILE_PRINT_DIRECT);
    			m_pCmdInfo = NULL;
    		}
    		bResult = FALSE;
    		break;
    
    		// If we're doing DDE, hide ourselves
    
    	case CCommandLineInfo::FileDDE:
    		m_pCmdInfo = (CCommandLineInfo*)(UINT_PTR)m_nCmdShow;
    		m_nCmdShow = SW_HIDE;
    		break;
    
    	// If we've been asked to register, exit without showing UI.
    	// Registration was already done in InitInstance().
    	case CCommandLineInfo::AppRegister:
    		{
    			Register();			
    			bResult = FALSE;    // that's all we do
    
    			// If nobody is using it already, we can use it.
    			// We'll flag that we're unregistering and not save our state
    			// on the way out. This new object gets deleted by the
    			// app object destructor.
    
    			if (m_pCmdInfo == NULL)
    			{
    				m_pCmdInfo = new CCommandLineInfo;
    				m_pCmdInfo->m_nShellCommand = CCommandLineInfo::AppUnregister;
    			}
    			break;
    		}
    
    	// If we've been asked to unregister, unregister and then terminate
    	case CCommandLineInfo::AppUnregister:
    		{
    			BOOL bUnregistered = Unregister();
    
    			// if you specify /EMBEDDED, we won't make an success/failure box
    			// this use of /EMBEDDED is not related to OLE
    
    			if (!rCmdInfo.m_bRunEmbedded)
    			{
    				if (bUnregistered)
    					AfxMessageBox(AFX_IDP_UNREG_DONE);
    				else
    					AfxMessageBox(AFX_IDP_UNREG_FAILURE);
    			}
    			bResult = FALSE;    // that's all we do
    
    			// If nobody is using it already, we can use it.
    			// We'll flag that we're unregistering and not save our state
    			// on the way out. This new object gets deleted by the
    			// app object destructor.
    
    			if (m_pCmdInfo == NULL)
    			{
    				m_pCmdInfo = new CCommandLineInfo;
    				m_pCmdInfo->m_nShellCommand = CCommandLineInfo::AppUnregister;
    			}
    		}
    		break;
    	}
    	return bResult;
    }
    


    通过上面的内容我们可以看出:如果没有对ID_FILE_NEW做映射的话出现问题就在OnFileNew();   CWinApp对OnFileNew的默认实现是调用m_pDocManager->OnFileNew();我们继续解析cdocmanager,它究竟干了些什么?   (首先说明一下CDocManager它主要的功能是帮助CWinApp是管理文档模板链表和注册文件类型.)

    //如果模板列表为空的话   
    
    if (m_templateList.IsEmpty())   
    
    {   
    
     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;  
    
     else 
    
      return;     // none - cancel operation   
    
    }
    
    assert(ptemplate != NULL);   
    
    ASSERT_KINDOF(CDocTemplate, pTemplate);
    
    ptemplate->opendocumentfile(null);
     


    过观察上面的代码我们很容易的看出 有两个可能出错的原因:1 CreateNewDocument返回为NULL 2 createnewframe 返回为空。先看 CreateNewDocument() 一般来说这个函数很少失败。不过在调试时也不能掉以轻心。  再看看CreateNewFrame()  里面有一个函数LoadFrame是造成这种“建立新文档失败”错误的源泉所在。   只要它返回False就会弹出这样的提示。   我们在来看看LoadFrame() 里面调用CFrameWnd::Create()来创建窗口,创建窗口失败返回Fasle。  这样问题就变的比较简单了。看看create和createex函数的动作就知道怎么回事了。   

    1 如果找不到菜单资源 返回False 同时也弹出“建立空文档失败”  

    2 重载了PreCreateWindow而且返回False也会导致弹出“建立空文档失败” 

    3 在OnCreate 里面返回-1 也会导致弹出“建立空文档失败”。 

     

     

    展开全文
  • vc 建立空文档失败 问题跟踪

    千次阅读 2011-04-08 17:15:00
    <br />问题引入:  新建一个mfc单文档程序后,删除了所有的工具栏条目,程序编译通过,但在执行时后提示:“建立空文档失败”,程序退出 问题分析:  由于工具栏资源被删除,所以在int ...

    问题引入:
        新建一个mfc单文档程序后,删除了所有的工具栏条目,程序编译通过,但在执行时后提示:“建立空文档失败”,程序退出
    问题分析:
        由于工具栏资源被删除,所以在int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    里面创建工具栏目时候会失败。 但是这和弹出“建立空文档失败”看不出直接联系。为了查出根本原因,这里进行深入调试。

        跟踪调试,问题出现在 代码 if (!ProcessShellCommand(cmdInfo)),设计一正常程序深入调试,查找原因。

    1、C:/Program Files/Microsoft Visual Studio/VC98/MFC/SRC/APPUI2.CPP文件函数:
       BOOL CWinApp::ProcessShellCommand(CCommandLineInfo& rCmdInfo) 
         中,定位到代码:
        if (!AfxGetApp()->OnCmdMsg(ID_FILE_NEW, 0, NULL, NULL)),该语句处理消息ID_FILE_NEW, 进入步骤2


    2、C:/Program Files/Microsoft Visual Studio/VC98/MFC/SRC/DOCMGR.CPP 的void CDocManager::OnFileNew()
    函数,发现如果m_templateList列表为空,会导致该问题,如下:
    if (m_templateList.IsEmpty())
    {
       TRACE0("Error: no document templates registered with CWinApp./n");
       AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC);
       return;
    }
    继续跟踪至
    3、C:/Program Files/Microsoft Visual Studio/VC98/MFC/SRC/DOCSINGL.CPP
    的函数:CDocument* CSingleDocTemplate::OpenDocumentFile(LPCTSTR lpszPathName, BOOL bMakeVisible)
    该函数里如果CreateNewDocument失败,也会导致该问题,如下:
       pDocument = CreateNewDocument();
       ASSERT(pFrame == NULL);     // will be created below
       bCreated = TRUE;
    }

    if (pDocument == NULL)
    {
       AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC);
       return NULL;
    }
    跟踪分析,删除工具栏目对CreateNewDocument应该没影响。

    另外该函数里如果CreateNewFrame失败,也会导致该问题,如下:

       pFrame = CreateNewFrame(pDocument, NULL);
       pDocument->m_bAutoDelete = bAutoDelete;
       if (pFrame == NULL)
       {
        AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC);
        delete pDocument;       // explicit delete on error
        return NULL;
       }

    我们深入跟踪语句: pFrame = CreateNewFrame(pDocument, NULL);进入代码文件
    C:/Program Files/Microsoft Visual Studio/VC98/MFC/SRC/DOCTEMPL.CPP 的函数
    CFrameWnd* CDocTemplate::CreateNewFrame(CDocument* pDoc, CFrameWnd* pOther),在这里,跟踪语句
    if (!pFrame->LoadFrame(m_nIDResource,
        WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE,   // default frame styles
        NULL, &context))

    使我们进入到C:/Program Files/Microsoft Visual Studio/VC98/MFC/SRC/WINFRM.CPP文件的
    BOOL CFrameWnd::LoadFrame(UINT nIDResource, DWORD dwDefaultStyle,
    CWnd* pParentWnd, CCreateContext* pContext) 函数,至此,我们发现该函数的语句
    if (!Create(lpszClass, lpszTitle, dwDefaultStyle, rectDefault,
       pParentWnd, MAKEINTRESOURCE(nIDResource), 0L, pContext))
    {
       return FALSE;   // will self destruct on failure normally
    }
    调用了CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct),这里工具栏创建的失败,导致问题的出现

    展开全文
  • mfc新建单文档程序 基类选用FormView 调用自定义控件后运行 提示建立空文档失败 请问怎么办
  • MFC的单文档程序SDI,编译无错,运行弹出“建立空文档失败”对话框,然后程序退出,并没有其他的错误提示。 并没有深入去跟踪,大概搜索了一下网络上的一些分析,症结在资源文件,就是.rc文件上。 我这个工程文件...

    MFC的单文档程序SDI,编译无错,运行弹出“建立空文档失败”对话框,然后程序退出,并没有其他的错误提示。

    并没有深入去跟踪,大概搜索了一下网络上的一些分析,症结在资源文件,就是.rc文件上。

    我这个工程文件sln并没有把rc文件加入到工程里,于是通过“添加现有项”把rc文件添加进工程,编译通过。

    如果不是这个原因,那么请继续在网络上搜索吧。。。我的问题已经解决了,分享一下解决方案顺便备忘。

    展开全文
  • VS2005 建立空文档失败!

    千次阅读 2010-01-06 16:20:00
    在进行分视操作的时候,原来流利的操作让这个小小的错误阻挡了,建立空文档失败。找了好多原因。结果是CListBox不是一个视图。误当做是CListView来处理了。 不过也有收获。 CCommandLineInfo cmdInfo;初始化时如果...
  • vc 建立空文档失败 问题跟踪 .

    千次阅读 2011-08-31 17:31:32
     新建一个mfc单文档程序后,删除了所有的工具栏条目,程序编译通过,但在执行时后提示:“建立空文档失败”,程序退出 问题分析:  由于工具栏资源被删除,所以在int CMainFrame::OnCreate(LPCREATESTRUCT ...
  • 存档日期:2019年5月14日 | 首次发布:2016年4月13日 使用IBM Bluemix上的Embeddable Reporting服务来构建用于分析开放数据集的端到端报告解决方案。 此内容不再被更新或维护。 全文以PDF格式“按原样”提供。...
  • CMapX的SetGeoSet 建立空文档失败 问题

    千次阅读 2006-08-29 11:41:00
    出现建立空文档失败错误,搜索网络中相关文档,大抵都是在m_ctrlMapX.Create后使用,却未曾见出现类似错误,百思不得其解,不得已,将该句放到了View::OnCreate的最后: // toggle scalebar on OnV
  • 关于"建立空文档失败"的问题

    千次阅读 2008-01-18 17:10:00
    关于"建立空文档失败"的问题的分析! 这类问题的出现主要在BOOL CWinApp::ProcessShellCommand(CCommandLineInfo& rCmdInfo); 函数的关键内容: BOOL bResult = TRUE; switch (rCmdInfo.m_nShellCommand)
  • 多文档、多模板程序建立新的子框架类后,出现“建立空文档失败”问题的解决办法   不知道大家的情况是否跟我的一样。   首先,建立一个继承自CMDIChildWndEx类的子框架类:  ...
  • 在进行多文档编辑时,采用VC的类向导添加了 框架类,文档类,视图类,但是添加之后 新建文档时提示“创建新文档失败”,跟踪代码发现 错误出在: m_pfnCreateObject指针为,造成创建失败,对比发现错误出在,...
  • 同事把一个VC++2003开发...ProcessShellCommand(cmdInfo)) 运行后弹出“创建空文档失败”对话框。困扰了他一段时间(两天),我拿来调了一会,只感觉应该是CMainFrame创建失败导致,不过没找出真正原因。后来还是他发现了
  • 关于"建立空文档失败"的问题的分析! 许多新手在遇到此类问题时总是措手无策,如果谁有耐心就看看我写的下面这片文章吧。 这类问题的出现主要在BOOL CWinApp::ProcessShellCommand(CCommandLineInfo& rCmdInfo...
  • 工程名称和类名改了一下,编译均没有问题,就是运行时提示“建立空文档失败”,然后程序就退出了,还有,生成的可执行文件的图标变成了Win32默认的图标了。 通过跟踪发现是CFrameWnd::Create()中的 HINSTANCE ...
  • 关于"建立空文档失败"的问题的分析

    千次阅读 2004-07-26 11:22:00
    转帖: 关于"建立空文档失败"的问题的分析! 许多新手在遇到此类问题时总是措手无策,如果谁有耐心就看看我写的下面这片文章吧。 这类问题的出现主要在BOOL CWinApp::ProcessShellCommand(CCommandLineInfo& ...
  • 在文档视图结构mainframe里用了个CMSComm 类,结果在程序发布的时候客户机器出现“建立空文档失败”的错误提示。经过测试,是CMSComm 的creat 失败。解决办法:1.在目标机器注册MSComm.ocx,用安装工具自动注册或...
  • 从别人那里拷来MapX+MFC的程序琢磨,在别人机子上能正确运行,到了自己机器编译通过,点击运行总是提示“建立空文档失败。”,跟踪调试发现,在下面的函数中出现问题:int CMainFrame::OnCreate(LPCREATESTRUCT ...
  • 在开发Modbus转发器时应用到MSCOMM32.OCX控件,但在未安装VC开发环境的机器上,总会弹出"建立空文档失败"的情况,所幸的是软件的使用人员是自己公司的,但久而久之,他们感觉非常不便,于是我在网上找了好多好多关于”建立...
  • 关于"建立空文档失败"的问题的分析!许多新手在遇到此类问题时总是措手无策,如果谁有耐心就看看我写的下面这片文章吧。这类问题的出现主要在BOOL CWinApp::ProcessShellCommand(CCommandLineInfo& rCmdInfo);函数的...
  • 最后, 我们看怎么样解决不想在应用程序启动时的创建新文档的问题: 直接在 InitInstance()函数中用如下代码代替原来的几行即可: CCommandLineInfo cmdInfo; cmdInfo.m_nShellCommand = CCommandLineInfo::...
  • 其中:AFX_IDP_FAILED_TO_CREATE_DOC 就是字符“建立空文档失败”的资源id  // create a new document  pDocument = CreateNewDocument();  ASSERT(pFrame == NULL); // will be created below  bCreated = ...
  • 关于"建立空文档失败"的问题的分析! 许多新手在遇到此类问题时总是措手无策,如果谁有耐心就看看我写的下面这片文章吧。 这类问题的出现主要在BOOL CWinApp::ProcessShellCommand(CCommandLineInfo& rCmdInfo); ...
  • 原文地址: ... ...这类问题的出现主要在...我碰到一个例子是在资源管理删除了工具栏后,编译通过,但是运行是报错“建立空文档失败”。其实就是当中的第三个因素。后面我把创建工具栏的代码去 掉后,运行成功。
  • 我用VC++6.0建立了一个单文本文档的程序,调试情况下运行正常,我觉得可以发布了,改成release版本,编译没问题,运行时却提示“建立空文档失败”。 不知道论坛里的前辈、高手们有没有遇到类似的问题,希望传授...
  • 其中:AFX_IDP_FAILED_TO_CREATE_DOC 就是字符“建立空文档失败”的资源id // create a new document pDocument = CreateNewDocument(); ASSERT(pFrame == NULL); // will be created below bCreated = TRUE; if ...
  • 其中:AFX_IDP_FAILED_TO_CREATE_DOC 就是字符“建立空文档失败”的资源id // create a new document pDocument = CreateNewDocument(); ASSERT(pFrame == NULL); // will be created below bCreated = TRUE; if ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 200,147
精华内容 80,058
关键字:

怎样建立空文档