我正在尝试使用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包含了我需要的所有标头)。

我搜索了此错误,但找不到任何解决方案,这只是一个简单的程序,所以我不明白这里的问题是什么:(。

请帮我。

最佳答案

从CreateProcessW文档中,特别是关于第二个参数的信息:


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


因此,在回答您的问题时,请勿将常量字符串文字作为该函数的第二个参数传递,否则您将获得AV。

08-19 19:02