首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

错误有关问题:Windows 已在 XXXX.exe 中触发一个断点

2012-05-28 
异常问题:Windows 已在 XXXX.exe 中触发一个断点以下代码:查找需要终止的进程的handle,并终止,但是出现以

异常问题:Windows 已在 XXXX.exe 中触发一个断点
以下代码:查找需要终止的进程的handle,并终止,但是出现以下异常,网上找到信息说CString需要释放,但是调用了szProcessName.ReleaseBuffer()还是同样的异常 Windows 已在 XXXX.exe 中触发一个断点。
其原因可能是堆被损坏,这说明 XXXX.exe 中或它所加载的任何 DLL 中有 Bug。  

C/C++ code
void FindProcess(CString strProcessName){    DWORD aProcesses[100], cbNeeded, cbMNeeded;//aProcesses为进程ID数组    HMODULE hMods[100];    //HMODULE* hMods;    HANDLE hProcess;    //char szProcessName[MAX_PATH];    CString szProcessName;    //AfxMessageBox(_T("OK!!!"));    if ( !EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded) )        return;    for(int i=0; i< (int) (cbNeeded / sizeof(DWORD)); i++)    {        //_tprintf(_T("%d/t"), aProcesses[i]);        hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, aProcesses[i]);        if ( hProcess != NULL ){            EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbMNeeded);            LPWSTR tempStr = szProcessName.GetBuffer();            GetModuleFileNameEx( hProcess, hMods[0], tempStr, 100);            //GetShortPathName(szProcessName,szProcessName.GetBuffer(),256);            //AfxMessageBox(szProcessName);            //if(strstr(szProcessName, strProcessName))            if(szProcessName == strProcessName)            {                //TerminateProcess(hProcess, 0);                AfxMessageBox(szProcessName);                szProcessName.ReleaseBuffer();                TerminateProcess(hProcess, 0);                //break;                CloseHandle(hProcess);                return;                //return aProcesses[i];                //其原因可能是堆被损坏,这说明GYKF.exe 中或它所加载的任何DLL 中有Bug            }            szProcessName.ReleaseBuffer();        }    }    CloseHandle(hProcess);    //return 0;}



[解决办法]
试试 LPWSTR tempStr = szProcessName.GetBuffer(100);
[解决办法]
LPWSTR tempStr = szProcessName.GetBuffer();
GetModuleFileNameEx( hProcess, hMods[0], tempStr, 100);
你这样用,栈不被破坏,说明你运气太好了.(原因,请自行了解CString实现)
还是老老实实为其分配一个字符缓冲区吧;

TCHAR tempStr[MAX_PATH]={0};
GetModuleFileNameEx( hProcess, hMods[0], tempStr, MAX_PATH);
szProcessName=tempStr;
这样就不会有问题了.

热点排行