Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Получить консольный вывод chkdsk [D7, WinXP]


_Seldon_ ©   (2005-06-10 03:32:00) 

Пытаюсь получить консольный вывод chkdsk'a:

var
 SecurityAttr:TSecurityAttributes;
 StartupInfo:TStartupInfo;
 ProcessInfo:TProcessInformation;
 PipeRead,PipeWrite:THandle;
 Buff:array[0..255]of Char;
 BytesRead:Cardinal;
begin
 SecurityAttr.nLength:=SizeOf(SecurityAttr);
 SecurityAttr.lpSecurityDescriptor:=nil;
 SecurityAttr.bInheritHandle:=true;
 CreatePipe(PipeRead,PipeWrite,@SecurityAttr,0);

 with StartupInfo do
 begin
   FillChar(StartupInfo,SizeOf(StartupInfo),#0);
   cb:=SizeOf(StartupInfo);
   dwFlags:=STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
   StartupInfo.wShowWindow:=SW_HIDE;
   hStdInput:=GetStdHandle(STD_INPUT_HANDLE);
   hStdOutput:=PipeWrite;
   hStdError:=PipeWrite;
 end;

 if CreateProcess(nil,'chkdsk.exe /?',nil,nil,true,NORMAL_PRIORITY_CLASS,nil,nil,StartupInfo,ProcessInfo) then  
 begin
   CloseHandle(PipeWrite);
   while ReadFile(PipeRead,Buff,256,BytesRead,nil)and(BytesRead>0) do
   begin
     Buff[BytesRead]:=#0;
     Memo1.Lines.Text:=Memo1.Lines.Text+Buff;
   end;
   if WaitForSingleObject(ProcessInfo.hProcess,INFINITE)=WAIT_OBJECT_0 then
   begin
     CloseHandle(ProcessInfo.hThread);
     CloseHandle(ProcessInfo.hProcess);
   end;
 end
 else
   CloseHandle(PipeWrite);
 CloseHandle(PipeRead);
end;


для chkdsk.exe код не получает ни одной строки, если же запускать reg.exe, то всё работает.

Где грабли?


_Seldon_   (2005-06-10 20:09:00) [1]

>Polevi
Ну, здешний фак не работает. Да и получать консольный ввод/вывод у меня получается с помощью приведённого кода. Я проверял его на многих консольных приложениях из Windows\system32 - работает. Не работает только с chkdsk.exe. А перехватывать мне нужно именно его консольный вывод.


Polevi   (2005-06-10 19:31:00) [2]

в фак есть пример запуска процесса с перехватом консольного ввода/вывода


_Seldon_   (2005-06-10 14:53:00) [3]

Согласен, но где-то ещё одни грабли.
Выполнение к Buff[Pred(BytesRead)]:=#0;не попадает по причине BytesRead=0. И если запускать например "chkdsk.exe c:" то он диск проверять не будет, а тут же завершиться. Но если же убрать STARTF_USESTDHANDLES из dwFlags, то он запускается и проверяет диск.


Digitman   (2005-06-10 09:25:00) [4]


> Где грабли?


"грабли" здесь :

var
SecurityAttr:TSecurityAttributes;
StartupInfo:TStartupInfo;
ProcessInfo:TProcessInformation;
PipeRead,PipeWrite:THandle;
Buff:array[0..255]of Char;
BytesRead:Cardinal;

begin
SecurityAttr.nLength:=SizeOf(SecurityAttr);
SecurityAttr.lpSecurityDescriptor:=nil;
SecurityAttr.bInheritHandle:=true;
Win32Check(CreatePipe(PipeRead,PipeWrite,@SecurityAttr,0));

with StartupInfo do
begin
  FillChar(StartupInfo,SizeOf(StartupInfo),#0);
  cb:=SizeOf(StartupInfo);
  dwFlags:=STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
  StartupInfo.wShowWindow:=SW_HIDE;
  hStdInput:=GetStdHandle(STD_INPUT_HANDLE);
  hStdOutput:=PipeWrite;
  hStdError:=PipeWrite;
end;
 try
   try
     Win32Check(CreateProcess(nil,'chkdsk.exe /?',nil,nil,true,NORMAL_PRIORITY_CLASS,nil,nil,StartupInfo,ProcessInfo));
   finally
     CloseHandle(PipeWrite);
   end;
   try
     while ReadFile(PipeRead,Buff,256,BytesRead,nil)and(BytesRead>0) do
       begin
         Buff[ Pred(BytesRead)]:=#0;
          oemtoansibuff(@Buff, @Buff, strlen(@Buff));
         Memo1.Lines.Text:=Memo1.Lines.Text+Buff;
       end;
     Win32Check(WaitForSingleObject(ProcessInfo.hProcess,INFINITE)=WAIT_OBJECT_0);
   finally
     CloseHandle(ProcessInfo.hThread);
     CloseHandle(ProcessInfo.hProcess);
   end;
 finally
   CloseHandle(PipeRead);
 end;
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо