ErickSkrauch
@ErickSkrauch

Почему CreateProcess не всегда правильно работает?

Код в Delphi выглядит так:
FillChar(StartUpInfo, SizeOf(TStartUpInfo), 0);
with StartUpInfo do begin
  cb:= SizeOf(TStartUpInfo);
  dwFlags:= STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
  wShowWindow:= ShowCmd;
end;
CreateProcess(nil, PWideChar(JavaPath+' '+Parameters), nil, nil, False, NORMAL_PRIORITY_CLASS, nil, MinecraftPath, StartUpInfo, ProcessInfo);
WaitForInputIdle(hProcess, INFINITE);
WaitforSingleObject(hProcess, INFINITE);
GetExitCodeProcess(hProcess, ExitCode);
CloseHandle(hThread);
CloseHandle(hProcess);


Проблема в том, что при попытке запустить 1.6.4 и Forge модификации (по факту - просто другой набор библиотек и главный класс) ничего не происходит - где ловить ошибку, непонятно.

И мы бы искали проблему в себе, но если взять тот код, который исполняет Delphi, и вставить банально в bat файл - всё заработает.

Что делать?
  • Вопрос задан
  • 3785 просмотров
Пригласить эксперта
Ответы на вопрос 2
MaxiMonster
@MaxiMonster
Может вам поможет что-то вроде ShellExecute?
Ответ написан
shineblu
@shineblu
Добрый день,

Так у Вас все останавливается на WaitforSingleObject(hProcess, INFINITE); после того как Вы вызвали функцию первый раз. Второе приложение не будет запущено пока не завершится первое.

Как дополнение, попробуйте эту функцию:

function ExecuteApplication(ACmd: string; AWaitForTerminate: boolean=false; AHideWindow: boolean = false): THandle;
var
  si: STARTUPINFO;
  pi: PROCESS_INFORMATION;
begin
  Result:=0;
  try
      ZeroMemory(@si,sizeof(si));
      si.cb:=SizeOf(si);
      si.dwFlags := STARTF_USESHOWWINDOW;
      if AHideWindow then si.wShowWindow := SW_HIDE else si.wShowWindow := SW_SHOW;
      if not CreateProcess(nil, PChar(ACmd), nil, nil, False, 0, nil, nil, si, pi)
      then begin
          Exit;
      end;
      Result:=pi.hProcess;
      if AWaitForTerminate
      then begin
          WaitForSingleObject(pi.hProcess, INFINITE );
          CloseHandle(pi.hProcess);
          CloseHandle(pi.hThread);
      end;
  except
  end;
end;


И для отладки - проверяйте что содержится в переменной ACmd. Т.е. если Ваш путь к EXEшке и аргументы содержат пробелы, то путь к приложению и каждый такой параметр должны быть заключены в кавычки

Успехов!
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы