0

运行此代码时出现异常:

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 上遇到异常。

谢谢 :)

4

2 回答 2

6

尽可能清楚地在文档中说明:

此函数的 Unicode 版本 CreateProcessW 可以修改此字符串的内容。因此,此参数不能是指向只读内存的指针(例如 const 变量或文字字符串)。如果此参数是一个常量字符串,该函数可能会导致访问冲突

L"program.dat"的属于这个规则。将字符串复制到某个WCHAR变量中并传递它。

于 2013-11-12T14:30:32.897 回答
4

我可以使用您的代码重现异常。我认为问题在于 CreateProcess 的第二个参数是输入/输出参数。该文档指出:

系统将终止空字符添加到命令行字符串以将文件名与参数分开。这将原始字符串分成两个字符串进行内部处理。

请参见CreateProcess 函数

第二个参数不能指向只读内存。

使用 Visual Studio 调试器并单步执行汇编程序代码,该陷阱确实是由 Kernel32 中的 _CreateProcessInternal 函数试图将 0x 写入 L“program.dat”的末尾,作为字符串常量,它处于“不可写”状态“ 部分。

使用以下代码:

wchar_t * pCommandLine = L"program.dat";
wchar_t CommandLine[ 64 ];
wcscpy( CommandLine,  pCommandLine );
CreateProcess(NULL, CommandLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);

异常将消失。

至于用“program.dat”创建子进程?!?那是另一个故事。

于 2013-11-12T13:16:39.600 回答