Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Работа с консолью


Автор: maleziv 5.12.2011, 22:36
Доброго времени суток  уважаемые.
Вопрос в следующем, как прочитать содержимое консоли после выполнение команды.
Демонстрирую на примере “Командной строки” (cmd), в будущем консоль  будет немного  другая, пока тестирую на этой.
Программно посылаю в консоль команду dir. Как результат выполнения команды dir поместить в переменную(то есть содержимое отображенное в консоли, выполненной команды dir  записать в  переменную)? 
Хочу добавить, что  в той консоли для которой пишется  программа команды “Командной строки” не работают. Варианты типа  “Создать батник и перенаправить стандартный вывод в файл не подойдут”. Необходимо непосредственно считывать данные с консоли после выполнения в ней команд. При чем консоль всегда запущена, и ее нельзя закрывать-открывать. Работаю с “Командной строкой”, т.к  пока нет возможности работать напрямую с консолью для которой  пишется программа из за ее производственной необходимости. Прошу  помочь разобраться. 
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  Window,Panel,Group,Button:hwnd;
  i: Integer;
  s, ss: string;
   p:PChar;
begin
Window:=FindWindow(nil, 'Командная строка);
 p:=StrAlloc(20);
// if Window<>0 then ShowMessage('Ed');
if Window <> 0 then
   begin
     s := 'dir';
     for i := 1 to Length(s) do
     begin
       SendMessage(Window, WM_CHAR, Word(s[i]), 0);
        sleep(100);
        end;
     // Simulate Return Key.
    PostMessage(Window, WM_KEYDOWN, VK_RETURN, 0);
   end;

end;

Автор: Delvish 6.12.2011, 09:28
используй Pipes. пример пинга из командной строки:

Код

function Ping(IP : String) : String;
const BUFSIZE = 2000;
var
   hReadPipe,
   hWritePipe : THandle;
   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('ping.exe '+ IP),
     @SecAttr, 
     @SecAttr, 
     true,
     NORMAL_PRIORITY_CLASS,
     nil, 
     nil, 
     StartupInfo, 
     ProcessInfo) then 
    begin
      repeat 
        WaitReason := WaitForSingleObject(ProcessInfo.hProcess, 50);
        Application.ProcessMessages; 
      until (WaitReason <> WAIT_TIMEOUT);
      Repeat 
        BytesRead := 0; 
        ReadFile(hReadPipe, Buffer[0], BUFSIZE, BytesRead, nil); 
        Buffer[BytesRead]:= #0; 
        OemToAnsi(Buffer,Buffer);
        Result := String(Buffer);
      until (BytesRead < BUFSIZE); 
    end;
  FreeMem(Buffer); 
  CloseHandle(ProcessInfo.hProcess); 
  CloseHandle(ProcessInfo.hThread);
  CloseHandle(hReadPipe); 
  CloseHandle(hWritePipe); 
end;
end;

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