Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.07;
Скачать: CL | DM;

Вниз

Получить консольный вывод chkdsk   Найти похожие ветки 

 
_Seldon_   (2005-06-10 03:32) [0]

Пытаюсь получить консольный вывод 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, то всё работает.

Где грабли?


 
Digitman ©   (2005-06-10 09:25) [1]


> Где грабли?


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

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;


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

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


 
Polevi ©   (2005-06-10 19:31) [3]

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2005.08.07;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.046 c
14-1121414851
syte_ser78
2005-07-15 12:07
2005.08.07
Задачка для 6 класса.


14-1121358494
Магнум
2005-07-14 20:28
2005.08.07
Игры на КПК


3-1119954270
АМБ
2005-06-28 14:24
2005.08.07
Изменение имени поля


4-1118149449
A№t0№
2005-06-07 17:04
2005.08.07
Процедуры и функции из DLL


1-1121773434
msguns
2005-07-19 15:43
2005.08.07
События динамически создаваемых объектов