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

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

Как в режиме раельного времени работать с вводом/выводом консоли? [D7, WinXP]


relaxive ©   (2009-10-11 15:57:00) 

Т.е. открыть консоль, получать данные при выводе информации и посылать данные в консоль при этом не закрывая ее. Например:

Microsoft Windows XP [Версия 5.1.2600]
(С) Корпорация Майкрософт, 1985-2001.

C:\Documents and Settings\Admin>

Произошел вывод - выводим это в своем приложении

Вводим:
cd ..
И так далее.


Eraser   (2009-10-12 01:54:00) [1]

> [0] relaxive   (11.10.09 15:57)

ищи в гугле, примеров полно. в JEDI даже спец. компонент есть.


Германн   (2009-10-12 00:42:00) [2]


> дайте работающий дод

У меня нет такого дода. :(


relaxive   (2009-10-11 16:48:00) [3]

Вообщем понял что через пайпы, дайте работающий дод, этот не работает:
program Project1;
{$APPTYPE CONSOLE}

uses Windows,
    SysUtils;

var SA:TSecurityAttributes;
   SI:TStartupInfo;
   PI:TProcessInformation;
   fexit,cstdin,wstdin,rstdout,cstdout:THandle;
   WasOK:Boolean;
   ReadBuff,WriteBuff:array[0..255]of Char;
   BytesCount:Cardinal;

begin

with SA do
begin
 nLength:=SizeOf(SA);
 bInheritHandle:=True;
 lpSecurityDescriptor:=nil;
end;

if not CreatePipe(cstdin,wstdin,@SA,0) then exit;
if not CreatePipe(rstdout,cstdout,@SA,0) then exit;

GetStartupInfo(SI);

try

 with SI do
 begin
   dwFlags:=STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
   wShowWindow:=SW_HIDE;
   hStdOutput:=cstdout;
   hStdError:=cstdout;
   hStdInput:=cstdin;
 end;

 WasOK:=CreateProcess(nil,PChar('cmd'),nil,nil,true,CREATE_NEW_CONSOLE{0},nil,nil ,SI,PI);

 if not WasOK then exit
 else
   try

   while((GetExitCodeProcess(PI.hProcess,fexit))and(fexit=STILL_ACTIVE)and(WriteBuf f<>'exit'))do
   begin
   readln(WriteBuff);
   WriteFile(wstdin,WriteBuff,1,BytesCount,nil);
   repeat
     WasOK:=ReadFile(rstdout,ReadBuff,255,BytesCount,nil);
       if BytesCount > 0 then
       begin
         write(ReadBuff);
       end;
   until not WasOK or(BytesCount<255);
     sleep(1);
   end;

   WaitForSingleObject(PI.hProcess,INFINITE);
   finally

   CloseHandle(PI.hThread);
   CloseHandle(PI.hProcess);
   end;

finally
CloseHandle(fexit);
CloseHandle(cstdin);
CloseHandle(wstdin);
CloseHandle(rstdout);
CloseHandle(cstdout);
end;

end.

Проблема с циклом


Наверх

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