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

Вниз

Как поймать вывод консольного приложения   Найти похожие ветки 

 
ab programmer   (2002-11-01 14:00) [0]

Из Delphi-шной программы запускается консольное приложение (под win 2000). Каким образом я могу поймать то что эта прога выдает на стандартное устройство вывода (stdout). Помогите пожалуйста!


 
Opuhshii ©   (2002-11-01 14:04) [1]

ReadConsole/ReadConsoleInput/ ReadConsoleOutput


 
ab programmer   (2002-11-01 14:09) [2]

А что я должен передать в качестве handl"а output-буфера?


 
ab programmer   (2002-11-01 14:22) [3]

Если возможно оставьте образец кода.

Я пытался сделать таким образом:


var si: TStartupInfo;
pi: TProcessInformation;
h: THandle;
app, cmd, dir: string;
papp, pcmd, pdir: pchar;
cons: THandle;
buf: array[0..64000] of char;
r: cardinal;
sa: TSecurityAttributes;
begin
sa.nLength:=sizeof(sa);
sa.lpSecurityDescriptor:=nil;
sa.bInheritHandle:=true;

cons:=CreateConsoleScreenBuffer(GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE,
@sa,
CONSOLE_TEXTMODE_BUFFER,
nil);


ZeroMemory(@si, SizeOf(si));
si.cb:=SizeOf(si);
si.hStdOutput:=cons;
si.dwFlags:=STARTF_USESTDHANDLES;

cmd:=edit1.Text+" "+Edit2.Text+#0;
pcmd:=@cmd[1];
dir:=edit3.Text;
if dir="" then pdir:=nil else pdir:=@dir[1];

CreateProcess(nil,
pcmd,
@sa,
@sa,
true,
0,
nil,
pdir,
si,
pi);
WaitForSingleObject(pi.hProcess, INFINITE);

ReadFile(cons, buf[0], sizeof(buf), r, nil);
buf[r]:=#0;
Memo1.Text:=StrPas(buf);

CloseHandle(cons);
end;



Текст на экран уже не выкидывается, а вот в прогу не попадает...


 
Evgeny V   (2002-11-01 14:26) [4]

Если прога запускается из вашей программы, то ее надо запускать через CretateProcess(привожу код из одного примера на С++).const int BUFSIZE = 2000;
int i=0;
SECURITY_ATTRIBUTES SecAttr;
HANDLE hReadPipe, hWritePipe;
STARTUPINFO StartupInfo;
PROCESS_INFORMATION ProcessInfo;
char *Buffer;
char k;
AnsiString s;
DWORD WaitReason, BytesRead ,TotalByte,b;
SecAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
SecAttr.bInheritHandle = true;
SecAttr.lpSecurityDescriptor = NULL;
if (CreatePipe (&hReadPipe, &hWritePipe, &SecAttr, 0))
{
Buffer =(char *) new char[BUFSIZE + 1]; // Allochiamo un buffer di dimensioni BUFSIZE+1
setmem((void *)Buffer,BUFSIZE + 1,0);
setmem((void *)&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(NULL,
CmdLine.c_str(),
&SecAttr,
&SecAttr,
true,
NORMAL_PRIORITY_CLASS ,
NULL,
NULL,
&StartupInfo,
&ProcessInfo))
{
do{
WaitReason = WaitForSingleObject( ProcessInfo.hProcess,10);
BytesRead=GetExitCodeProcess(ProcessInfo.hProcess,&WaitReason);
if(BytesRead==0)
break;
Application->ProcessMessages();
} while (WaitReason == STILL_ACTIVE);


do
{
BytesRead = 0;
TotalByte=0;
BytesRead=PeekNamedPipe(hReadPipe,&Buffer[0],BUFSIZE,&b,&TotalByte,0);
// Leggiamo "BUFSIZE" bytes dalla pipe
if(BytesRead==0)
break;
if(TotalByte==0)
break;
if(TotalByte>BUFSIZE/2)
TotalByte=BUFSIZE/2;
BytesRead = 0;
ReadFile(hReadPipe, &Buffer[0], TotalByte, &BytesRead, NULL);
// в Buffer данные от проги
}
while(TotalByte!=0)


 
ab programmer   (2002-11-01 15:22) [5]

Работает!!!
БОЛЬШОЕ СПАСИБО!



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

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

Наверх




Память: 0.48 MB
Время: 0.019 c
1-33983
Дмитрий К.К.
2002-11-01 08:46
2002.11.11
Еще раз о создании компонентов в RUN-TIME


1-33931
Юра
2002-10-31 23:11
2002.11.11
Как запустить программу и открыть файл, нажав Enter на файле?


1-34103
Calm
2002-10-30 16:58
2002.11.11
Странный модуль Proxies.pas


1-34049
pas_andry
2002-10-30 18:05
2002.11.11
Как в TListView узнать отмеченные записи


14-34171
Карлсон
2002-10-12 14:38
2002.11.11
где план достать и хватит ли одной тонны пластида.