![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Получить консольный вывод 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;