
08.09.2012, 03:49
|
 |
Профессионал
|
|
Регистрация: 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;
|