posts - 134,comments - 22,trackbacks - 0
          <2008年11月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          30123456

          常用鏈接

          留言簿(4)

          我參與的團(tuán)隊(duì)

          隨筆分類(lèi)

          隨筆檔案

          收藏夾

          C++ 社區(qū)

          常用網(wǎng)站

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

           

           

          這類(lèi)問(wèn)題的出現(xiàn)主要在bool CWinApp::ProcessShellCommand(CCommandLineInfo& rCmdInfo);

          函數(shù)的關(guān)鍵內(nèi)容: 
          BOOL bResult = TRUE; 
          switch (rCmdInfo.m_nShellCommand) 

          case CCommandLineInfo::FileNew:  //
          新建 
           if (!AfxGetApp()->OnCmdMsg(ID_FILE_NEW
          0, NULL, NULL)) 
            OnFileNew(); 
           if (m_pMainWnd == NULL) <_pv


          3&­'  
            bResult = FALSE; 
           break; 
          case CCommandLineInfo::FileOpen: 
           if (!OpenDocumentFile(rCmdInfo.m_strFileName)) 
            bResult = FALSE; 
           break; 
          通過(guò)上面的內(nèi)容我們可以看出:如果沒(méi)有對(duì)ID_FILE_NEW做映射的話出現(xiàn)問(wèn)題就在OnFileNew(); 
          CWinApp
          對(duì)OnFileNew的默認(rèn)實(shí)現(xiàn)是調(diào)用m_pDocManager->OnFileNew();

          我們繼續(xù)解析cdocmanager,它究竟干了些什么? 
          (首先說(shuō)明一下CDocManager它主要的功能是幫助CWinApp是管理文檔模板鏈表和注冊(cè)文件類(lèi)型.

          //如果模板列表為空的話 
          if (m_templateList.IsEmpty()) 
          { r;Rg">h


          q  
           TRACE0("Error: no document templates registered with CWinApp. 
          "); 
           AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC);  //報(bào)錯(cuò)并返回.這里不會(huì)報(bào)建立新文檔出錯(cuò)。 
           return; q3,7I
          ?m
           
          }

          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 mT?#=


          w  
          }

          assert(ptemplate != NULL); ­Mv


          ]kW  
          ASSERT_KINDOF(CDocTemplate pTemplate);

          ptemplate->opendocumentfile(null);

          通過(guò)上面的代碼我們可以看出,cwinapponfilenewonfileopen分別調(diào)用cdocmanager的虛擬函數(shù)onfilenewonfileopen。而在cdocmanager里面。通過(guò)模板鏈表選擇不同的模板來(lái)調(diào)用文檔模板的opendocumentfile(); 
          如果傳入?yún)?shù)NULL表示新建文件。

          下面我們來(lái)看看cdoctemplate::opendocumentfile()它是一個(gè)最關(guān)鍵的函數(shù)。因?yàn)樗翘摂M函數(shù),我們考慮CSingleDocTemplate::OpenDocumentFile的情況。 z


          4RqL=  
          這個(gè)函數(shù)里面有一段代碼: 
          其中: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);
          %BvyG
           
           delete pDocument;       // explicit delete on error 
           return NULL; 
          }

          通過(guò)觀察上面的代碼我們很容易的看出有兩個(gè)可能出錯(cuò)的原因:1 CreateNewDocument返回為NULL 2 createnewframe 返回為空。

          先看 CreateNewDocument() 一般來(lái)說(shuō)這個(gè)函數(shù)很少失敗。不過(guò)在調(diào)試時(shí)也不能掉以輕心。


          6GYC
          >'@  
          再看看CreateNewFrame()  里面有一個(gè)函數(shù)LoadFrame是造成這種建立新文檔失敗錯(cuò)誤的源泉所在。 
          只要它返回False就會(huì)彈出這樣的提示。 
          我們?cè)趤?lái)看看LoadFrame() 里面調(diào)用CFrameWnd::Create()來(lái)創(chuàng)建窗口,創(chuàng)建窗口失敗返回Fasle。 
          這樣問(wèn)題就變的比較簡(jiǎn)單了。

          看看createcreateex函數(shù)的動(dòng)作就知道怎么回事了。 H-@


          [V:!R  
          ****************************************************************S_zS  
          1如果找不到菜單資源返回False 同時(shí)也彈出建立空文檔失敗” 
          HINSTANCE hInst = AfxFindResourceHandle(lpszMenuName
          , RT_MENU); 
          if ((hMenu = ::LoadMenu(hInst
          , lpszMenuName)) == NULL) 

           TRACE0("Warning: failed to load menu for CFrameWnd. Dq
          dtg
           
          "); 
           PostNcDestroy();            // perhaps delete the C++ object 
           return FALSE; 
          } v

           7* ­C
           
          2重載了PreCreateWindow而且返回False也會(huì)導(dǎo)致彈出建立空文檔失敗” 
          3OnCreate 里面返回-1 也會(huì)導(dǎo)致彈出建立空文檔失敗。 
          ******************************************************************

          以上就是我分析的出現(xiàn)這樣建立空文檔失敗問(wèn)題的大致原因。也許還有其他的原因。我這里就不一一列舉了。

          posted on 2008-11-29 16:01 何克勤 閱讀(9126) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): VC++/MFC

          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 府谷县| 犍为县| 彩票| 沙湾县| 鄂尔多斯市| 武安市| 抚宁县| 修文县| 密云县| 嘉黎县| 博乐市| 洪湖市| 米林县| 朝阳区| 杭州市| 宜城市| 项城市| 北碚区| 武穴市| 肥西县| 三门县| 绩溪县| 隆化县| 黄浦区| 泽州县| 元江| 仁化县| 汉寿县| 灌云县| 剑川县| 沂南县| 新竹市| 遂平县| 彝良县| 建瓯市| 山丹县| 辽中县| 九龙坡区| 苗栗县| 开原市| 乌拉特后旗|