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及上面的朋友們。