Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > TMemo + cmd.exe


Автор: YURIC 17.7.2004, 18:18
Помогите люди добрые как прочитать в TMemo результат выполнения какой-либо проги из досовского окна (Командной строки).

Напрмер:

Код
ping 127.0.0.1
// Мне выдаст
C:\>ping 127.0.0.1

Обмен пакетами с 127.0.0.1 по 32 байт:

Ответ от 127.0.0.1: число байт=32 время<10мс TTL=128
Ответ от 127.0.0.1: число байт=32 время<10мс TTL=128
Ответ от 127.0.0.1: число байт=32 время<10мс TTL=128
Ответ от 127.0.0.1: число байт=32 время<10мс TTL=128


Как мне этот ответ прочитать и засунуть в TMemo?

Автор: _hunter 17.7.2004, 18:28
два варианта:
1.
переслать в текстовый файл и прочитать его
2.
изменить STARTUPINFO.hStdOutput ( при запуске cmd.exe ) на свой вход

Автор: YURIC 17.7.2004, 18:31
_hunter

А с исходником можно второй вариант?

Первый не подходит... sad.gif

Автор: _hunter 17.7.2004, 18:41
примерно так:
MS:=TMemoryStream.Create();//поток для получения вывода (MS:TMemoryStream)
SI.hStdOutput:=MS.Handle;//SI:TStartupInfo;
...
CreateProcess(...);

Автор: YURIC 17.7.2004, 18:42
_hunter
Спасибо попробую, но мне кажется как-то проще можно, у меня был исходник, примерно с год назад такую херню писал, потом я его потерял и вот щас найти не могу. sad.gif

Автор: p0s0l 17.7.2004, 18:46
DRKB гласит, что для этого можно юзать такую процедурину:
Код
procedure Dos2Win(CmdLine:String; OutMemo:TMemo);
const BUFSIZE = 2000;
var SecAttr    : TSecurityAttributes;
   hReadPipe,
   hWritePipe : THandle;
   StartupInfo: TStartUpInfo;
   ProcessInfo: TProcessInformation;
   Buffer     : Pchar;
   WaitReason,
   BytesRead  : DWord;
begin

with SecAttr do
begin
  nlength              := SizeOf(TSecurityAttributes);
  binherithandle       := true;
  lpsecuritydescriptor := nil;
end;
if Createpipe (hReadPipe, hWritePipe, @SecAttr, 0) then
begin
  Buffer  := AllocMem(BUFSIZE + 1);
  FillChar(StartupInfo, Sizeof(StartupInfo), #0);
  StartupInfo.cb          := SizeOf(StartupInfo);
  StartupInfo.hStdOutput  := hWritePipe;
  StartupInfo.hStdInput   := hReadPipe;
  StartupInfo.dwFlags     := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
  StartupInfo.wShowWindow := SW_HIDE;

  if CreateProcess(nil,
     PChar(CmdLine),
     @SecAttr,
     @SecAttr,
     true,
     NORMAL_PRIORITY_CLASS,
     nil,
     nil,
     StartupInfo,
     ProcessInfo) then
    begin
      repeat
        WaitReason := WaitForSingleObject(ProcessInfo.hProcess,100);
        Application.ProcessMessages;
      until (WaitReason <> WAIT_TIMEOUT);
      Repeat
        BytesRead := 0;
        ReadFile(hReadPipe, Buffer[0], BUFSIZE, BytesRead, nil);
        Buffer[BytesRead]:= #0;
        OemToAnsi(Buffer,Buffer);
        OutMemo.Text := OutMemo.text + String(Buffer);
      until (BytesRead < BUFSIZE);
    end;
  FreeMem(Buffer);
  CloseHandle(ProcessInfo.hProcess);
  CloseHandle(ProcessInfo.hThread);
  CloseHandle(hReadPipe);
  CloseHandle(hWritePipe);
end;
end;

// пример вызова
procedure TForm1.Button2Click(Sender: TObject);
begin
 Dos2Win('ping 127.0.0.1', Memo1);
end;


Автор: YURIC 17.7.2004, 18:55
p0s0l

Сенкс!!!!!
То что надо!!!

у меня есть DRKB но я наверно слепой thumbs-up.gif

Автор: Петрович 19.7.2004, 07:58
Цитата
DRKB гласит

Простите за невежество smile.gif. А кто такой DRKB?

Автор: Girder 19.7.2004, 08:05
Цитата
А кто такой DRKB?

http://forum.vingrad.ru/index.php?showtopic=22229

Автор: Петрович 19.7.2004, 08:33
Спасибо, стормозил smile.gif.
Маленькое замечание.
По моему, не надо делать
Код
 StartupInfo.hStdInput   := hReadPipe;
поскольку это назначает в качестве стандартного потока ввода для запускаемой программы "второй" конец трубы (пайпа) соединяемого со стандартным потоком вывода для нее. Следовательно, если запускаемая программа будет читать из потока ввода, например подтверждения, то она прочтет свой-же вывод.

Автор: Borland_Delphi_6 19.7.2004, 11:52
p0s0l
Отлично! Получай плюс! user posted image

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)