Лови:
| Код | function GetDosOutput(const CommandLine:string): string; var SA: TSecurityAttributes; SI: TStartupInfo; PI: TProcessInformation; StdOutPipeRead, StdOutPipeWrite: THandle; WasOK: Boolean; Buffer: array[0..255] of Char; BytesRead: Cardinal; Line: String;
function OEM2Ansi(const S : string) : string; // Конвертирует строку из кодировки DOS в Windows кодировку begin SetLength(Result,Length(S)); if Length(S) <> 0 then OemToChar(pChar(S),pChar(Result)); end; begin Application.ProcessMessages; with SA do begin nLength:= SizeOf(SA); bInheritHandle:= True; lpSecurityDescriptor:= nil; end; // создаём пайп для перенаправления стандартного вывода CreatePipe(StdOutPipeRead, // дескриптор чтения StdOutPipeWrite, // дескриптор записи @SA, // аттрибуты безопасности 0 // количество байт принятых для пайпа - 0 по умолчанию ); try // Создаём дочерний процесс, используя StdOutPipeWrite в качестве стандартного вывода, // а так же проверяем, чтобы он не показывался на экране. with SI do begin FillChar(SI, SizeOf(SI), 0); cb := SizeOf(SI); dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES; wShowWindow := SW_HIDE; hStdInput := GetStdHandle(STD_INPUT_HANDLE); // стандартный ввод не перенаправляем hStdOutput := StdOutPipeWrite; hStdError := StdOutPipeWrite; end;
// Запускаем компилятор из командной строки WasOK := CreateProcess(nil, PChar(CommandLine), nil, nil, True, 0, nil, nil, SI, PI);
// Теперь, когда дескриптор получен, для безопасности закрываем запись. // Нам не нужно, чтобы произошло случайное чтение или запись. CloseHandle(StdOutPipeWrite); // если процесс может быть создан, то дескриптор, это его вывод if not WasOK then raise Exception.Create('Could not execute command line!') else try // получаем весь вывод до тех пор, пока DOS-приложение не будет завершено Line := ''; repeat // читаем блок символов (могут содержать возвраты каретки и переводы строки) WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil);
// есть ли что-нибудь ещё для чтения? if BytesRead > 0 then begin // завершаем буфер PChar-ом Buffer[BytesRead] := #0; // добавляем буфер в общий вывод Line := Line + Buffer; end; until not WasOK or (BytesRead = 0); // ждём, пока завершится консольное приложение WaitForSingleObject(PI.hProcess, INFINITE); finally // Закрываем все оставшиеся дескрипторы CloseHandle(PI.hThread); CloseHandle(PI.hProcess); end; finally result:= OEM2Ansi(Line); CloseHandle(StdOutPipeRead); end; end;
function GetTimeNet(host: String): String; begin Result:= 'none'; with TStringList.Create do try Text:= GetDosOutput(Format('net time \\%s', [host])); if (count <> 0) and (Strings[0][Length(Strings[0])] = 'M') then Result:= copy(Strings[0], Length(Strings[0])-18, MaxInt); finally Free; end; end; |
Пример использования:
| Код | procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(GetTimeNet('alex')); end; | |