unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function splitString(const Source, ch:String):TStringList;
var
temp:String;
i:Integer;
begin
Result := TStringList.Create;
//如果是空自符串则返回空列表
if Source='' then
Exit;
temp := Source;
i:=pos(ch,Source);
while i<>0 do
begin
Result.add(copy(temp,0,i-1));
Delete(temp,1,i);
i:=pos(ch,temp);
end;
Result.add(temp);
end;
procedure CheckResult(b: Boolean);
begin
if not b then
raise Exception.Create(SysErrorMessage(GetLastError));
end;
function RunDOS(const CommandLine: string): string;
var
HRead, HWrite: THandle;
StartInfo: TStartupInfoA;
ProceInfo: TProcessInformation;
b: Boolean;
sa: TSecurityAttributes;
inS: THandleStream;
sRet: TStrings;
begin
Result := '';
FillChar(sa, sizeof(sa), 0);
// 设置允许继承,否则在NT和2000下无法取得输出结果
sa.nLength := sizeof(sa);
sa.bInheritHandle := True;
sa.lpSecurityDescriptor := nil;
b := CreatePipe(HRead, HWrite, @sa, 0);
CheckResult(b);
FillChar(StartInfo, sizeof(StartInfo), 0);
StartInfo.cb := sizeof(StartInfo);
StartInfo.wShowWindow := SW_HIDE;
// 使用指定的句柄作为标准输入输出的文件句柄,使用指定的显示方式
StartInfo.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
StartInfo.hStdError := HWrite;
StartInfo.hStdInput := GetStdHandle(STD_INPUT_HANDLE); // HRead;
StartInfo.hStdOutput := HWrite;
b := CreateProcessA(nil, // lpApplicationName: PChar
PAnsiChar(AnsiString(CommandLine)), // lpCommandLine: PAnsiChar
nil, // lpProcessAttributes: PSecurityAttributes
nil, // lpThreadAttributes: PSecurityAttributes
True, // bInheritHandles: BOOL
CREATE_NEW_CONSOLE, nil, nil, StartInfo, ProceInfo);
CheckResult(b);
WaitForSingleObject(ProceInfo.hProcess, INFINITE);
inS := THandleStream.Create(HRead);
if inS.Size > 0 then
begin
sRet := TStringList.Create;
sRet.LoadFromStream(inS);
Result := sRet.Text;
sRet.Free;
end;
inS.Free;
CloseHandle(HRead);
CloseHandle(HWrite);
end;
//line[0]: java version "1.8.0_91"
//line[1]: Java(TM) SE Runtime Environment (build 1.8.0_91-b15)
//line[2]: Java HotSpot(TM) 64-Bit Server VM (build 25.91-b15, mixed mode)
function getJavaVersion(line : Integer): string;
var
tmp : string;
list : TStringList;
begin
Result := 'no java';
tmp := runDos('java -version');
if tmp<>'' then
begin
list := splitString(tmp, #13#10);
if line
Result := list[line];
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
caption:=getJavaVersion(0);
end;
end.