1

CreateProcess を使用してゲームの .exe を開こうとしていますが、未処理の例外エラーが発生します。私はすでに問題と解決策を見つけましたが、ファイル ダイアログ ボックスから CreateProcess の 2 番目のパラメーターのパスを取得する必要があります (その部分は完了しており、機能しています)。問題は:

CreateProcess の 2 番目のパラメーターについては、その値 (2 番目のパラメーター) を持つ変数を宣言する必要がありますが、ファイル ダイアログ ボックスで選択されたファイルへのパスの変数を「ポイント」すると、それは実行されません。もう働かない。

これが本当にばかげた質問であれば申し訳ありませんが、私はC++から始めています。

動作するコードは次のとおりです。

    wchar_t szGameDir[] = L"PATH_TO_EXE";

    if ( CreateProcess (
        NULL,
        szGameDir, NULL, NULL, FALSE,
        CREATE_UNICODE_ENVIRONMENT,
        NULL, NULL,
        &pstStartupInfo, &pstProcInfo ) )

しかし、szGameDir を 'pszGameDir' (ユーザーが選択した EXE へのパス) の値に設定すると、未処理の例外エラーが発生します...

wchar_t* szGameDir = pszGameDir;

if ( CreateProcess (
        NULL,
        szGameDir, NULL, NULL, FALSE,
        CREATE_UNICODE_ENVIRONMENT,
        NULL, NULL,
        &pstStartupInfo, &pstProcInfo ) )

ここで「pszGameDir」を初期化します。

OPENFILENAME DialogBox;
ZeroMemory ( &DialogBox, sizeof(DialogBox) );

DialogBox.lStructSize       = sizeof(OPENFILENAME);
DialogBox.hwndOwner         = NULL;
DialogBox.lpstrFilter       = L"Grand Theft Auto: Vice City (*.exe)\0*.exe\0";
DialogBox.lpstrFile         = (LPTSTR)this->pszGameDir;
DialogBox.nMaxFile          = MAX_PATH;
DialogBox.nMaxFileTitle     = sizeof ( L"gta-vc.exe" );
DialogBox.lpstrTitle        = L"Please, select 'gta-vc.exe'";
DialogBox.Flags             = 0x02000000 | 0x00001000 | 0x00000400 | 0x10000000 | 0x00020000 | 0x00000800 | 0x0000008;
DialogBox.nFileExtension    = (WORD)"exe";
DialogBox.lpstrDefExt       = L"exe";

return GetOpenFileName ( &DialogBox ) != 0 ? 1 : NULL;

誰かが私を助けることができますか?(はい、すでに検索しましたが、正直なところ、この特定のことについては見つけられませんでした。修正することもできませんでした..)

4

1 に答える 1

1

CreateProcess では、コマンド ライン パラメーターを書き込み可能にする必要があります。MSDNで引数の説明を読んでください。

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

それは書き込み可能でなければなりません、私は恐れています。

于 2013-04-02T22:09:07.280 に答える