Форум: "WinAPI";
Текущий архив: 2005.08.07;
Скачать: [xml.tar.bz2];
Вниз
Получить консольный вывод 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 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.08.07;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.045 c