Я пытаюсь использовать CreateProcess, чтобы открыть игру .exe, но у меня ошибка необработанного исключения. Я уже выяснил проблему и решение, но мне нужно получить путь для второго параметра CreateProcess из диалогового окна файла (эта часть сделана и работает). Проблема в:
Для второго параметра CreateProcess мне нужно объявить переменную со значением в ней (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;
Кто-нибудь может мне помочь? (Да, я уже искал, но, честно говоря, я не нашел об этой конкретной вещи, я также не смог исправить это ..)
CreateProcess требует, чтобы параметр командной строки был доступен для записи. Прочитайте описание аргумента на MSDN:
Версия этой функции Unicode, CreateProcessW, может изменять содержимое этой строки. Следовательно, этот параметр не может быть указателем на постоянную память (такую как переменная const или литеральная строка). Если этот параметр является константной строкой, функция может вызвать нарушение прав доступа.
Боюсь, это должно быть доступно для записи.
Других решений пока нет …