Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.03.2008, 00:57   #1
malevich
Пользователь
 
Аватар для malevich
 
Регистрация: 01.11.2006
Сообщений: 63
Вопрос прочитать что выдало CMD.exe

Немогу справится с такой проблемой:

Консольная прога выдает в окне CMD.EXE какой-то результат (неважно какой), я хочу этот результат считать. есть ли а API что-нибудь такое?

окно я нашел:
FindWindow(nil,'C:\WINDOWS\System32 \cmd.exe')
А дальше что?

Заранее весьма признателен...
malevich вне форума Ответить с цитированием
Старый 03.03.2008, 01:48   #2
AlDelta
Реанимируюсь...
Участник клуба
 
Аватар для AlDelta
 
Регистрация: 19.07.2007
Сообщений: 1,445
По умолчанию

Перенаправь вывод в файл и работай с ним:
комманда >c:\log.txt
Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте.
Правила форума => Правила раздела => Для общего развития => Помощь студентам => Перед тем, как создавать тему, скачайте себе...
P.S.: форум не песочница (с)
название статьи на сайте MS: "Отмена принудительного отключения автоматического запуска в реестре Windows"
AlDelta вне форума Ответить с цитированием
Старый 03.03.2008, 02:19   #3
malevich
Пользователь
 
Аватар для malevich
 
Регистрация: 01.11.2006
Сообщений: 63
По умолчанию

:-) Мне нужно в динамике
Консольная программа (есть только exe,исходника нет) работает долго,выводя строку в которой указано сколько ей еще осталось работать. Хочу ее прочитать и отобразить ProgressBar'ом либо TGauge
malevich вне форума Ответить с цитированием
Старый 03.03.2008, 07:45   #4
Viteef
stopfake.org
Участник клуба
 
Регистрация: 03.05.2007
Сообщений: 1,927
По умолчанию

Так попробуй
Код:
 

{....} 
  private 
    function RunCaptured(const _dirName, _exeName, _cmdLine: string): Boolean; 
     
{....} 

function TForm1.RunCaptured(const _dirName, _exeName, _cmdLine: string): Boolean; 
var 
  start: TStartupInfo; 
  procInfo: TProcessInformation; 
  tmpName: string; 
  tmp: Windows.THandle; 
  tmpSec: TSecurityAttributes; 
  res: TStringList; 
  return: Cardinal; 
begin 
  Result := False; 
  try 
    { Setze ein Temporares File } 
    { Set a temporary file } 
    tmpName := 'Test.tmp'; 
    FillChar(tmpSec, SizeOf(tmpSec), #0); 
    tmpSec.nLength := SizeOf(tmpSec); 
    tmpSec.bInheritHandle := True; 
    tmp := Windows.CreateFile(PChar(tmpName), 
           Generic_Write, File_Share_Write, 
           @tmpSec, Create_Always, File_Attribute_Normal, 0); 
    try 
      FillChar(start, SizeOf(start), #0); 
      start.cb          := SizeOf(start); 
      start.hStdOutput  := tmp; 
      start.dwFlags     := StartF_UseStdHandles or StartF_UseShowWindow; 
      start.wShowWindow := SW_Minimize; 
      { Starte das Programm } 
      { Start the program } 
      if CreateProcess(nil, PChar(_exeName + ' ' + _cmdLine), nil, nil, True, 
                       0, nil, PChar(_dirName), start, procInfo) then 
      begin 
        SetPriorityClass(procInfo.hProcess, Idle_Priority_Class); 
        WaitForSingleObject(procInfo.hProcess, Infinite); 
        GetExitCodeProcess(procInfo.hProcess, return); 
        Result := (return = 0); 
        CloseHandle(procInfo.hThread); 
        CloseHandle(procInfo.hProcess); 
        Windows.CloseHandle(tmp); 
        { Die Ausgaben hinzufugen } 
        { Add the output } 
        res := TStringList.Create; 
        try 
          res.LoadFromFile(tmpName); 
          Memo1.Lines.AddStrings(res); 
        finally 
          res.Free; 
        end; 
        Windows.DeleteFile(PChar(tmpName)); 
      end 
      else 
      begin 
        Application.MessageBox(PChar(SysErrorMessage(GetLastError())), 
          'RunCaptured Error', MB_OK); 
      end; 
    except 
      Windows.CloseHandle(tmp); 
      Windows.DeleteFile(PChar(tmpName)); 
      raise; 
    end; 
  finally 
  end; 
end; 
// Example: 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
  RunCaptured('C:\', 'cmd.exe', '/c dir'); 
end;
Viteef вне форума Ответить с цитированием
Старый 03.03.2008, 10:24   #5
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

http://msdn2.microsoft.com/en-us/library/ms682499.aspx
или
Код:
procedure TTransactionThread.CallDosAppRedirect( szCmd :PChar; dwWait  : DWORD;
  var sRes, sErr, sErrShow :string );
var
  sa         :TSecurityAttributes;
  si         :TStartupInfo;
  pi         :TProcessInformation;
  hReadOut   :THandle;  { pipe handles for redirecting STDOUT }
  hWriteOut  :THandle;
  hReadIn    :THandle;  { pipe handles for redirecting STDIN }
  hWriteIn   :THandle;
  bTest      :Boolean;
  dwRead      : DWORD;
  FBuffer    :array[0..255] of Char;
  sCmd       :string;
  i          :Integer;
begin
  { Security attributes for pipes }
  FillChar( sa, SizeOf(sa), 0 );
  sa.nLength := SizeOf( sa );
  sa.bInheritHandle := True;
  sa.lpSecurityDescriptor := nil;

  { Create pipe for output redirection }
  if (not CreatePipe( hReadOut,     // read end of the pipr
                      hWriteOut,    // write end of the pipe
                      @sa,          // security attributes
                      0))
  or Terminated then begin // bytes reserved - default 0.
    sErr     := sErr+'redirection error';
    sErrShow := 'Ошибка при перенаправлении стандартного вывода';
    Exit;
  end;

  { Create pipe for input redirection. }
  { It is not really used, but I need valid handles for safety }
  if (not CreatePipe( hReadIn,
                     hWriteIn,
                     @sa,
                     0))
  or Terminated then begin
    sErr     := 'redirection error';
    sErrShow := 'Ошибка при перенаправления стандартного ввода';
    CloseHandle( hReadOut );
    CloseHandle( hWriteOut );
    Exit;
  end;

  { Make child process use hWriteOut as standard out, and make }
  { sure it does not show on screen. }
  FillChar( si, SizeOf(si), 0 );
  si.cb          := Sizeof(si);
  si.dwFlags     := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
  si.wShowWindow := SW_HIDE;
  si.hStdInput   := hWriteIn;
  si.hStdOutput  := hWriteOut;
  si.hStdError   := hWriteOut;

  if (not CreateProcess( nil,
                        szCmd,
                       nil, nil, True, 0, nil, nil,
                       si, pi)) then begin
    sErr     := 'application start error';
    sErrShow := 'Ошибка при старте команды';
    CloseHandle( hReadOut );
    CloseHandle( hWriteOut );
    CloseHandle( hReadIn );
    CloseHandle( hWriteIn );
    Exit;
  end
  else
    Client.hProcess    := pi.hProcess;

  { Now that this has been inherited, close it to be safe. }
  CloseHandle( hWriteOut ); { child process uses it !!}
  CloseHandle( hReadIn );

  while( True ) do begin
    bTest := ReadFile( hReadOut,    // handle of the read end of our pipe
                      FBuffer,      // address of buffer that receives data
                      255,         // number of bytes to read
                      dwRead,      // number of bytes really read
                      nil );       // non-overlapped.
    if (not bTest) then begin
      {sErr := 'application output reading error ('+IntToStr(GetLastError)+')'#13#10;
      sErrShow := 'Ошибка чтения перенаправленного вывода';}
      Break;
    end;

    { pipe done - normal exit }
    if (dwRead = 0) or Terminated then
      Break;

    { Process extracted data }
    FBuffer[ dwRead ] := #0;
    sRes := sRes + StrPas( FBuffer );
  end;

  { Wait for CONSPAWN to finish }
  if Terminated
  or (WaitForSingleObject( pi.hProcess, dwWait ) = WAIT_TIMEOUT) then begin
    sErr := 'application timeout';
    sCmd := StrPas( szCmd );
    i := Pos( '\', sCmd );
    while i > 0 do begin
      sCmd := Copy( sCmd, i+1, Length(sCmd)-i);
      i := Pos( '\', sCmd );
    end;
    sErrShow := 'Команда '''+sCmd+''' исполняется слищком долго';
  end;

  { Close all remaining handles }
  CloseHandle (pi.hProcess);
  CloseHandle (pi.hThread );
  CloseHandle( hReadOut );
  CloseHandle( hWriteIn );
end;
пыщь
JTG вне форума Ответить с цитированием
Старый 03.03.2008, 21:35   #6
malevich
Пользователь
 
Аватар для malevich
 
Регистрация: 01.11.2006
Сообщений: 63
Радость

Всем большое спасибо!
Буду тестировать
malevich вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Xml, как правильно прочитать Parcenson Общие вопросы Delphi 0 02.09.2008 06:29
Где прочитать про WinApi? jurij Win Api 1 27.05.2008 13:32
Как прочитать данные из Repeater? posdnyaa БД в Delphi 0 07.04.2008 09:50
Как прочитать сообщение по ICQ? Иллидан Работа с сетью в Delphi 5 18.02.2008 18:33
как прочитать файл бодяга Общие вопросы Delphi 1 09.09.2007 20:37