c++ - 相同的 C++ 代码有时有效,有时无效

标签 c++ winapi

我的 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);

}

执行几次后,在 CreateProcess() 行上抛出 2 个异常,第一个:

Unhandled exception at 0x779D8829 (ntdll.dll) in PS_Down.exe: 0xC0000374: A heap has been corrupted (parameters: 0x77A15890).

第二个:

Exception thrown at 0x77946111 (ntdll.dll) in PS_Down.exe: 0xC0000005: Access violation reading location 0x00000069. 

我在其他几个项目(不包括 CreateProcess() 函数)中发生过这种情况,我注意到当涉及 TCHAR 和 SHGetKnownFolderPath() 时,它总是发生。 非常感谢任何有助于理解如何解决问题的帮助,在此先感谢!

P.S - 我是 cpp 编码的新手,所以请尝试相应地解释

最佳答案

lstrcat(path, L"\\calc.exe"); 会导致缓冲区溢出。 path 是指向数组的指针,它只能包含文件夹路径,仅此而已。您将需要分配一个宽字符串,附加文件夹路径,然后附加文件路径。此外,您还需要检查 SHGetKnownFolderPath 的结果以确定 path 是否包含有效指针,并稍后通过调用 CoTaskMemFree 释放它。

关于c++ - 相同的 C++ 代码有时有效,有时无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53649485/

相关文章:

c++ - 关于windows下文件操作的问题

C++ 枚举可以与整数进行比较但不能从整数分配?

c++ - 从 txt 文件行中获取多维数组

c++ - C、C++ 中可重入代码的推荐做法

delphi - 在delphi中调用DLL时发生异常?

c++ - 解除分配不会释放 Windows/C++ 应用程序中的内存

c++ - 将控制台应用程序中的字体更改为光栅字体

c++ - 使用远程线程的 DLL 注入(inject)在执行时不执行任何操作

c++ - C++ 编译器如何优化不正确的分层向下转换以导致真正的未定义行为

delphi - 在DCOM中传输记录最快的方法是什么