一个propertypage上面,三个页面A、B、C。A上面,实现对硬盘上的文件进行某种扫描,用线程实现,扫描结果的文件路径列在listbox中,有按钮可以控制开始、暂停、结束。在扫描结果的listbox中,可以通过右键菜单运行某个外挂程序(比如记事本),是用CreateProcess建立的单独的进程。在C页面中,专门做了对这种外挂程序的控制,即列表中列出可运行的外挂,有按钮控制运行、结束。现在有这样一个问题:在A中,暂停扫描状态下,右键菜单中运行了外挂程序后(比如记事本),然后再关掉外挂程序,再继续扫描,这个过程可进行一次或多次,最后点击“结束扫描”,扫描结束后会报错,信息是:Debug Assertion Failed!
出错的地方是winstr.cpp的57行。
另外,如果是开始扫描后,先停止扫描,然后运行外挂程序,再结束它,没有问题,但是如果再开始、结束扫描,又会报上面那个错误。如果在A界面暂停扫描、运行程序,然后在C界面结束它,再回到A界面继续扫描、停止扫描,就没有问题。很是郁闷。是不是新建立的进程与原来的线程什么的发生冲突呢???
出错的地方是winstr.cpp的57行。
另外,如果是开始扫描后,先停止扫描,然后运行外挂程序,再结束它,没有问题,但是如果再开始、结束扫描,又会报上面那个错误。如果在A界面暂停扫描、运行程序,然后在C界面结束它,再回到A界面继续扫描、停止扫描,就没有问题。很是郁闷。是不是新建立的进程与原来的线程什么的发生冲突呢???
#ifndef _AFXDLL
int AFXAPI AfxLoadString(UINT nID, LPTSTR lpszBuf, UINT nMaxBuf)
{
ASSERT(AfxIsValidAddress(lpszBuf, nMaxBuf*sizeof(TCHAR)));
#ifdef _DEBUG
// LoadString without annoying warning from the Debug kernel if the
// segment containing the string is not present
if (::FindResource(AfxGetResourceHandle(),
MAKEINTRESOURCE((nID>>4)+1), RT_STRING) == NULL)
{
lpszBuf[0] = '\0';
return 0; // not found
}
#endif //_DEBUG这里AfxIsValidAddress没有通过。说明当前lpszBuf指向的内存区无效。可能原因是:
1.未分配
2.某次操作中越界,导致gap标志被毁,仔细检查代码中有没有buf overflow的情况,重点检查下列操作:
strcpy, memcpy,strcat
CString::Format() 变量个数与格式字符串不匹配。 http://blog.aarony.net
说明内存地址无效!