Показать сообщение отдельно
  #3  
Старый 08.09.2012, 03:49
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Amgsys HQ
Написал следующий код для запуска Java-программы (.jar), но он почему-то не хочет отрабатывать:

Код:
JavaMachineExe := '<полный путь к java.exe>';
Params := '-Xmx1024M -Xms1024M -jar minecraft_server.jar nogui';
WorkFolder := 'M:\';
ShellExecute(0, 'open', PChar(JavaMachineEXE), PChar(Params), PChar(WorkFolder), SW_SHOWNORMAL);

Файл minecraft_server.jar лежит в папке <WorkFolder>.

Что я неправильно делаю? Почему не запускается .jar файл?
А то же самое в обычной командной строке запускается?

И какую версию Delphi используешь? Delphi 7 или Delphi XE. Если второе, то возможно у тебя путаница между Ansi и Wide. Попробуй так:
Код:
var
  JavaMachineExe, Params, WorkFolder: AnsiString;
begin
  JavaMachineExe := '<полный путь к java.exe>';
  Params := '-Xmx1024M -Xms1024M -jar minecraft_server.jar nogui';
  WorkFolder := 'M:\';
  ShellExecuteA(0, 'open', Pointer(JavaMachineEXE), Pointer(Params), Pointer(WorkFolder), SW_SHOWNORMAL);
end;
Или так:
Код:
var
  JavaMachineExe, Params, WorkFolder: WideString;
begin
  JavaMachineExe := '<полный путь к java.exe>';
  Params := '-Xmx1024M -Xms1024M -jar minecraft_server.jar nogui';
  WorkFolder := 'M:\';
  ShellExecuteW(0, 'open', Pointer(JavaMachineEXE), Pointer(Params), Pointer(WorkFolder), SW_SHOWNORMAL);
end;
Ещё можешь попробовать использовать CreateProcess вместо ShellExecute:
Код:
var
  SI: TStartupInfo;
  PI: TProcessInformation;
  JavaMachineExe, Params, WorkFolder: AnsiString;
begin
  FillChar(SI, SizeOf(SI), 0);
  SI.cb := SizeOf(SI);
  SI.wShowWindow := SW_SHOWNORMAL;
  SI.dwFlags := STARTF_USESHOWWINDOW;

  JavaMachineExe := '<полный путь к java.exe>';
  Params := AnsiQuotedStr(JavaMachineExe, '"') + ' -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui';
  WorkFolder := 'M:\';

  if not CreateProcessA(nil, Pointer(Params), nil, nil, False, NORMAL_PRIORITY_CLASS,
       nil, Pointer(WorkFolder), SI, PI) then RaiseLastOSError;

  try
    WaitForInputIdle(PI.hProcess, INFINITE);
//...
  finally
    CloseHandle(PI.hProcess);
    CloseHandle(PI.hThread);
  end;
end;
Ответить с цитированием