我的c ++代码可以直接工作几次,经过几次执行后它突然停止工作并抛出异常(没有任何变化!),我无法弄清楚原因.
这是代码中有问题的部分:
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
TCHAR *path;
SHGetKnownFolderPath(FOLDERID_Startup, KF_FLAG_CREATE, NULL, &path);
lstrcat(path, L"\\calc.exe");
if (CreateProcess(NULL, path, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi))
{
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
Run Code Online (Sandbox Code Playgroud)
执行几次后,CreateProcess()行会抛出2个异常,第一个:
Unhandled exception at 0x779D8829 (ntdll.dll) in PS_Down.exe: 0xC0000374: A heap has been corrupted (parameters: 0x77A15890).
Run Code Online (Sandbox Code Playgroud)
第二:
Exception thrown at 0x77946111 (ntdll.dll) in PS_Down.exe: 0xC0000005: Access violation reading location 0x00000069.
Run Code Online (Sandbox Code Playgroud)
它发生在我的一些其他项目(不包括CreateProcess()函数)和iv'e注意到它总是发生在涉及TCHAR和SHGetKnownFolderPath()时.任何有助于理解如何解决问题的帮助将非常感谢,提前感谢!
PS - 我是cpp编码的新手,所以请尝试相应地解释
lstrcat(path, L"\\calc.exe");将导致缓冲区溢出.path是一个指向数组的指针,只能包含文件夹路径,仅此而已.您需要分配一个宽字符串,追加文件夹路径,然后分配文件路径.此外,您还需要检查结果SHGetKnownFolderPath以确定是否path包含有效指针并稍后通过调用将其释放CoTaskMemFree.