<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 134,comments - 22,trackbacks - 0

     

     

    這類問(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è)文件類型.

    //如果模板列表為空的話 
    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 何克勤 閱讀(9122) 評(píng)論(0)  編輯  收藏 所屬分類: VC++/MFC

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲免费视频在线观看| 亚洲欧洲国产日韩精品| 亚洲AV无码资源在线观看| 国产91色综合久久免费分享| 久久精品国产亚洲av日韩| 99热精品在线免费观看| 亚洲视频在线观看网站| 国产精品1024永久免费视频| 亚洲天堂福利视频| 成人性生交大片免费看无遮挡| 亚洲午夜在线播放| 在线视频免费观看www动漫| 香蕉视频亚洲一级| 国产精品亚洲不卡一区二区三区 | 国产免费不卡v片在线观看| 亚洲一区精品视频在线| 岛国大片免费在线观看| 99亚洲乱人伦aⅴ精品| 亚洲免费视频一区二区三区| 两个人www免费高清视频| 亚洲一区二区电影| 日韩免费无砖专区2020狼| 成人a毛片视频免费看| 亚洲AV区无码字幕中文色| 国内精品免费麻豆网站91麻豆| 亚洲欧美中文日韩视频| 亚洲精品国精品久久99热| 免费国产99久久久香蕉| 亚洲成人免费电影| 国产又长又粗又爽免费视频| 中文在线日本免费永久18近| 亚洲沟沟美女亚洲沟沟| 免费的一级黄色片| 国产特黄特色的大片观看免费视频| 亚洲va在线va天堂va888www| 日韩欧美一区二区三区免费观看| 偷自拍亚洲视频在线观看| 亚洲AV日韩AV天堂久久 | 国产一级一毛免费黄片| 亚洲xxxx18| 亚洲无线码一区二区三区|