-1

このプログラムをVS2012Proでビルドして実行しようとしています。

#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には、必要なすべてのヘッダーが含まれています)。

このエラーを検索しましたが、解決策が見つかりませんでした。これは単純なプログラムであるため、ここで何が問題なのか理解できません:(。

私を助けてください。

4

1 に答える 1

4

CreateProcessWのドキュメントから、特に2番目のパラメーターについて:

この関数のUnicodeバージョンであるCreateProcessWは、この文字列の内容を変更できます。したがって、このパラメーターを読み取り専用メモリー(const変数やリテラル文字列など)へのポインターにすることはできません。このパラメータが定数文字列の場合、関数によってアクセス違反が発生する可能性があります

したがって、質問への回答として、定数文字列リテラルをその関数の2番目のパラメーターとして渡さないでください。渡さないと、AVが取得されます。

于 2013-02-15T08:14:53.800 に答える