CreateProcess Exception (kernel32.lib)

CreateProcess Exception (kernel32.lib)

本文关键字:lib kernel32 Exception CreateProcess      更新时间:2023-10-16

运行此代码时出现异常:

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"创建子进程?!?那是另一回事了。