Получение информации с DOS-консоли
Доброго времени суток, уважаемые эксперты. Очередной раз, собирая мозги по полу, обращаюсь к Вашей помощи. Тестирую приложение, помимо всего прочего во время исполнения считывается информация с консоли, и в это время происходит какая-то бяка. Нужно локализовать проблему, но я не могу не то что ее локализовать, я даже не могу понять, как работают эти трубки (pipes), а в инете нотаций классов TSecurityAttributes, TStartupInfo и пр. я что-то не нахожу. Вот кусок типичного по этой теме кода, прокомментируйте, пожалуйста, что там происходит или посоветуйте, где внятно описана эта тема.
function ipconfig(v_cmd:string):string;
const BUFSIZE = 2000;
var SecAttr: TSecurityAttributes;
hReadPipe, hWritePipe: THandle;
StartupInfo: TStartUpInfo;
ProcessInfo: TProcessInformation;
Buffer: Pchar;
WaitReason,BytesRead: DWord;
l_str:string;
i:integer;
begin
with SecAttr do
begin
nlength:= SizeOf(TSecurityAttributes);
binherithandle:= true;
lpsecuritydescriptor:= nil;
end;
if Createpipe(hReadPipe, hWritePipe, @SecAttr, 0) then
begin
Buffer:= AllocMem(BUFSIZE + 1);
FillChar(StartupInfo, Sizeof(StartupInfo), #0);
StartupInfo.cb:= SizeOf(StartupInfo);
StartupInfo.hStdOutput:= hWritePipe;
StartupInfo.hStdInput:= hReadPipe;
StartupInfo.dwFlags:= STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow:= SW_HIDE;
if CreateProcess(nil, PChar('ipconfig '), @SecAttr, @SecAttr, true, NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then
begin
repeat
WaitReason:= WaitForSingleObject( ProcessInfo.hProcess,100);
//Application.ProcessMessages;
//WriteLn( WaitReason);
until(WaitReason <> WAIT_TIMEOUT);
repeat
BytesRead := 0;
ReadFile(hReadPipe, Buffer[0], BUFSIZE, BytesRead, nil);
Buffer[BytesRead]:= #0;
OemToAnsi(Buffer,Buffer);
//Копим
l_str := l_str + String(buffer);
until(BytesRead < BUFSIZE);
end;
result:=l_str;
FreeMem(Buffer);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(hReadPipe);
CloseHandle(hWritePipe);
end;
end;