CreateProcess Exception (kernel32.lib)
CreateProcess Exception (kernel32.lib)
运行此代码时出现异常:
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
CreateProcess(NULL, L"program.dat", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE );
// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
我在WaitForSingleObject上得到异常。
谢谢:)
在
文档中可以说明的尽可能清楚:
此函数的 Unicode 版本 CreateProcessW 可以修改此字符串的内容。因此,此参数不能是指向只读内存(如 const 变量或文本字符串)的指针。如果此参数是常量字符串,则该函数可能会导致访问冲突。
你的L"program.dat"
属于这个规则。将字符串复制到某个WCHAR
变量中并传递它。
我可以使用您的代码重现异常。我认为问题在于创建过程的第二个参数是输入/输出参数。文档指出:
系统向命令行字符串添加终止空字符,以将文件名与参数分开。这会将原始字符串分成两个字符串进行内部处理。
请参阅创建进程函数
第二个参数不得指向只读内存。
使用 Visual Studio 调试器并单步执行汇编程序代码,陷阱确实是由 Kernel32 中的 _CreateProcessInternal 函数试图将 0x 写入 L"program.dat" 的末尾引起的,L"program" 作为字符串常量位于"不可写"部分中。
使用以下代码:
wchar_t * pCommandLine = L"program.dat";
wchar_t CommandLine[ 64 ];
wcscpy( CommandLine, pCommandLine );
CreateProcess(NULL, CommandLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
例外将消失。
至于使用"程序.dat"创建子进程?!?那是另一回事了。
相关文章:
- 如何指定我希望我的LIB链接到的DLL文件?-Visual Studio 2019
- JSON转换为nlohmann JSON-lib中的结构数组
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 使用 VS2015 在 Windows 10 上构建 Fortran .lib x64 位并将其链接到 C++
- 为什么我的链接器在找到Coin4d.lib后搜索Coin4sd.lib?
- libcpmtd.lib有什么用?
- InitializeCriticalSectionEx Not Located In KERNEL32.Dll
- LNK1104:无法打开libpjproject-i386-Win32-vc14-Debug-Static.lib
- 解析引用 |exe/dll vs lib
- 在 /usr/local/lib 下找不到库
- 当 Windows SDK 版本设置为 15063.13 时"LNK1104 Cannot open file 'kernel32.lib' "
- C |LNK1104-无法打开文件kernel32.lib
- Visual Studio 2012 alongside 2010 - kernel32.lib, windows.h
- Visual Studio 错误:LNK1104:无法打开文件'kernel32.lib' - 仅在 WP8 项目/Win32 版本中
- windows sdk 7.1 64位构建的CloseHandle显然不在kernel32.lib中
- CreateProcess Exception (kernel32.lib)
- 错误 LNK1104 无法打开文件'kernel32.lib'
- 错误 LNK1181:无法打开输入文件'kernel32.lib'
- LNK1104:链接 openCV 时无法打开文件 'kernel32.lib'
- kernel32.lib意外删除- VS 2012修复