1. 程式人生 > >0x657ac2b2 (msvcr80d.dll) 處未處理的異常: 0xC0000005: 讀取位置 0xccccccc8 時發生訪問衝突

0x657ac2b2 (msvcr80d.dll) 處未處理的異常: 0xC0000005: 讀取位置 0xccccccc8 時發生訪問衝突

 

開發環境 VS2005 + MFC基於對話方塊的工程

BOOL CVideoMFCApp::InitInstance()
{
    // 如果一個執行在 Windows XP 上的應用程式清單指定要
    // 使用 ComCtl32.dll 版本 6 或更高版本來啟用視覺化方式,
    //則需要 InitCommonControlsEx()。否則,將無法建立視窗。
    INITCOMMONCONTROLSEX InitCtrls;
    InitCtrls.dwSize = sizeof(InitCtrls);
    // 將它設定為包括所有要在應用程式中使用的
    // 公共控制元件類。
    InitCtrls.dwICC = ICC_WIN95_CLASSES;
    InitCommonControlsEx(&InitCtrls);

    CWinApp::InitInstance();

#ifdef _AFXDLL
    Enable3dControls();            // Call this when using MFC in a shared DLL
#else
    Enable3dControlsStatic();    // Call this when linking to MFC statically
#endif

    int w = GetSystemMetrics(SM_CXSCREEN);
    int h = GetSystemMetrics(SM_CYSCREEN);

    // 標準初始化
    // 如果未使用這些功能並希望減小
    // 最終可執行檔案的大小,則應移除下列
    // 不需要的特定初始化例程
    // 更改用於儲存設定的登錄檔項
    // TODO: 應適當修改該字串,
    // 例如修改為公司或組織名
    SetRegistryKey(_T("應用程式嚮導生成的本地應用程式"));

    CVideoMFCDlg dlg;
    m_pMainWnd = &dlg;
    INT_PTR nResponse = dlg.DoModal();

    if (nResponse == IDOK)
    {
        // TODO: 在此放置處理何時用
        //  “確定”來關閉對話方塊的程式碼
    }
    else if (nResponse == IDCANCEL)
    {
        // TODO: 在此放置處理何時用
        //  “取消”來關閉對話方塊的程式碼
    }

    // 由於對話方塊已關閉,所以將返回 FALSE 以便退出應用程式,
    //  而不是啟動應用程式的訊息泵。
    return FALSE;
}

點選中斷跳到:

*---------------------------------------------------------------------------
 *
 * Memory management
 *
 --------------------------------------------------------------------------*/

/***
*static int CheckBytes() - verify byte range set to proper value
*
*Purpose:
*       verify byte range set to proper value
*
*Entry:
*       unsigned char *pb       - pointer to start of byte range
*       unsigned char bCheck    - value byte range should be set to
*       size_t nSize            - size of byte range to be checked
*
*Return:
*       TRUE - if all bytes in range equal bcheck
*       FALSE otherwise
*
*******************************************************************************/
extern "C" static int __cdecl CheckBytes(
        unsigned char * pb,
        unsigned char bCheck,
        size_t nSize
        )
{
        int bOkay = TRUE;
        while (nSize--)
        {
           if (*pb++ != bCheck)      //》中斷點 

            {
/* Internal error report is just noise; calling functions all report results - JWM */
/*              _RPT3(_CRT_WARN, "memory check error at 0x%p = 0x%02X, should be 0x%02X.\n", */
/*                    (BYTE *)(pb-1),*(pb-1), bCheck); */
                bOkay = FALSE;
            }
        }
        return bOkay;
}

上述加粗紅色程式碼執行時報錯,大部分程式碼都是自動生成的
報錯提示“Debug assertion failed ” 報錯具體執行程式碼是
安裝目錄下的 dlgdata.cpp 的 40行 ,下面程式碼中加粗紅色部分

網上的討論:

執行到INT_PTR nResponse = dlg.DoModal();出錯
跟進去以後,發現具體位置在ASSERT(FALSE);這裡

檢查下是否你把資源中的某個控制元件刪除了?
並且DoDataExchange還在使用這個控制元件的ID。

如果是這樣的話,解決的方法就是,查詢這裡nIDC的值對應的ID的DEFINE,看看是否在DoDataExchange使用。

並且此ID無相關的在.rc檔案中的定義。

C/C++ code pSite = m_pDlgWnd->GetOleControlSite(nIDC);
      if (pSite == NULL)
      {
           TRACE(traceAppMsg, 0, "Error: no data exchange control with ID 0x%04X.\n", nIDC);
          ASSERT(FALSE);
          AfxThrowNotSupportedException();
      }

》》》》》》》》》》》》》》》》》》》》》》》
本人是怎樣解決問題的:
本人出現過上面的問題,程式編譯一直是正確的,但執行總是不能顯示對話方塊,顯示如題所示錯誤。
根據csdn上面的說明,找出問題是resource.h裡的幾個ID的關係,有ID沒有用過的刪除掉,然後在資源的rc檔案裡面對應部分報錯,找出來刪掉即可。
花了幾天時間終於搞定這個問題了,謝謝csdn及上面的朋友們。