1

我正在尝试使用 CreateProcess 打开游戏 .exe,但我遇到了未处理的异常错误。我已经弄清楚了问题和解决方案,但是我需要从文件对话框中获取 CreateProcess 的第二个参数的路径(该部分已完成并且可以工作)。问题是:

对于 CreateProcess 的第二个参数,我需要声明一个带有它的值的变量(第二个参数),但是如果我“指向”它指向在文件对话框中选择的文件的路径变量,它不会不再工作了。

如果这是一个非常愚蠢的问题,我很抱歉,但我从 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 回答