我正在尝试用VS2012 Pro构建和运行这个程序。
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
//allocate memory
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
//create child process
if (!CreateProcess(NULL, //use command line
L"mspaint.exe", //command line
NULL, //don't inherit process handle
NULL, //don't inherit thread handle
FALSE, //disable handle inheritance
0, //no creation flags
NULL, //use parent's environment block
NULL, //use parent's existing directory
&si,
&pi))
{
fprintf(stderr, "Create Process Failed");
return -1;
}
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return 0;
}
我收到此错误:
'ConsoleApplication1.exe'(Win32):已加载'G:\ workspace \ VS2012 \ ConsoleApplication1 \ Debug \ ConsoleApplication1.exe'。符号已加载。
'ConsoleApplication1.exe'(Win32):已加载'C:\ Windows \ SysWOW64 \ ntdll.dll'。无法找到或打开PDB文件。
'ConsoleApplication1.exe'(Win32):加载'C:\ Windows \ SysWOW64 \ kernel32.dll'。无法找到或打开PDB文件。
'ConsoleApplication1.exe'(Win32):已加载'C:\ Windows \ SysWOW64 \ KernelBase.dll'。无法找到或打开PDB文件。
'ConsoleApplication1.exe'(Win32):已加载'C:\ Windows \ SysWOW64 \ msvcr110d.dll'。符号已加载。
ConsoleApplication1.exe中0x763919E3(KernelBase.dll)的第一次机会异常:0xC0000005:访问冲突写入位置0x00CB586E。
ConsoleApplication1.exe中0x763919E3(KernelBase.dll)的未处理异常:0xC0000005:访问冲突写入位置0x00CB586E。
程序'[6992] ConsoleApplication1.exe'已退出,代码为0(0x0)。
请注意,我构建它时没有错误(文件stdafx.h包含我需要的所有头文件。)
我搜索了这个错误,但找不到任何解决方案,这只是一个简单的程序,所以我无法理解这里的问题是什么:(。
请帮帮我。
答案 0 :(得分:4)
从CreateProcessW文档中,特别是关于第二个参数:
此函数的Unicode版本CreateProcessW可以修改此字符串的内容。因此,此参数不能是只读内存的指针(例如const变量或文字字符串)。如果此参数是常量字符串,则该函数可能会导致访问冲突
因此,在回答您的问题时,不要将常量字符串文字作为第二个参数传递给该函数,否则您将获得AV。