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

Вниз

StdIn и StdOut   Найти похожие ветки 

 
Sergei ©   (2003-11-22 11:29) [0]

Господа!
Возникла проблема. Необходимо запустить внешнюю консольную программу и перенаправит вывод в свою программу. Вроде все просто. Что получилось: Создал pipe, перенаправил вывод этой программы в свой pipe и читаю. Все дело в том что эта программа(exe1) получает сообщения по TCP и запускает в свою очередь еще оду программу(exe2), которая использует DLL. DLL-ка тоже что-то выводит в консоль.
Что выводится если запустить все это в консоли:

1.Начало вывода exe2
2.Вывод DLL
3.Конец вывода exe2

А теперь что выводится после перенаправления:
2.Вывод DLL
1.Начало вывода exe2
3.Конец вывода exe2
И все это происходит не в real-time, как в консоли,а только после того как отработает сначала DLL-ка(получаю строку 2), а потом exe2(строки 1 и 3).Как сделать так чтобы и у меня данные в pipe появлялись сразу, а не только после того как все отработает?
Вот код:
InitializeSecurityDescriptor(@SD, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(@SD, True, Nil, false);
With SA Do
Begin
nLength := SizeOf(SA);
bInheritHandle := True;
lpSecurityDescriptor := @SD;
End;
SaveStdIn := GetStdHandle(STD_INPUT_HANDLE);
SaveStdOut := GetStdHandle(STD_OUTPUT_HANDLE);
CreatePipe(StdOutPipeRead,
StdOutPipeWrite,
@SA,
255 );
If Not SetStdHandle(STD_OUTPUT_HANDLE, StdOutPipeRead) Then
Raise Exception.Create("Not SetStdHandle");
If Not DuplicateHandle(GetCurrentProcess(), StdOutPipeRead,
GetCurrentProcess(), @Tmp1, 0, false, DUPLICATE_SAME_ACCESS) Then
Raise Exception.Create("Not Duplicate");
CloseHandle(StdOutPipeRead);
StdOutPipeRead := Tmp1;

CreatePipe(StdInPipeRead,
StdInPipeWrite,
@SA,
255 );
If Not SetStdHandle(STD_INPUT_HANDLE, StdInPipeRead) Then
Raise Exception.Create("Not SetStdHandle(STD_INPUT_HANDLE");
If Not DuplicateHandle(GetCurrentProcess(), StdInPipeRead,
GetCurrentProcess(), @Tmp2, 0, false, DUPLICATE_SAME_ACCESS) Then
Raise Exception.Create("Not Duplicate");
CloseHandle(StdInPipeRead);
StdInPipeRead := Tmp2;
Try
With SI Do
Begin
FillChar(SI, SizeOf(SI), 0);
cb := SizeOf(SI);
dwFlags := STARTF_USESHOWWINDOW Or STARTF_USESTDHANDLES;
wShowWindow := SW_HIDE;
hStdInput := StdInPipeRead;
hStdOutput := StdOutPipeWrite;
hStdError := StdOutPipeWrite;
End;
WorkDir := ExtractFilePath(CommandLine);
WasOK := CreateProcess(Nil, PChar(CommandLine + " " +
ParamLine), Nil, Nil,
True, CREATE_NEW_CONSOLE, Nil, PChar(WorkDir), SI, PI)
If Not WasOK Then
Begin
TaskHandle := 0;
dwProcessId := 0;
Raise Exception.Create("Could not execute command line!");
End
Else
Try
dwProcessId := PI.dwProcessId;
TaskHandle := PI.hProcess;
Repeat
WasOK := ReadFile(StdOutPipeRead, Buffer, 255, lpBytesRead, Nil);
If WasOK And (lpBytesRead > 0) Then
Begin
Buffer[lpBytesRead] := #0;
Line := Buffer;
Synchronize(UpdateMemo);
End;
Until Not WasOK Or Terminated;
Finally // wrap up
CloseHandle(PI.hThread);
CloseHandle(PI.hProcess);
End; // try/finally
Finally // wrap up
CloseHandle(StdOutPipeRead);
End; // try/finally


 
Alekc   (2003-11-22 15:00) [1]

Попробуй убрать эти сторочки:

SaveStdIn := GetStdHandle(STD_INPUT_HANDLE);
SaveStdOut := GetStdHandle(STD_OUTPUT_HANDLE);
.....
If Not SetStdHandle(STD_INPUT_HANDLE, StdInPipeRead) Then
Raise Exception.Create("Not SetStdHandle(STD_INPUT_HANDLE");
.....
If Not SetStdHandle(STD_INPUT_HANDLE, StdInPipeRead) Then
Raise Exception.Create("Not SetStdHandle(STD_INPUT_HANDLE");



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

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

Наверх




Память: 0.47 MB
Время: 0.032 c
1-93481
Jel
2004-01-15 11:56
2004.01.29
IShellLink.GetIconLocation - почему не работает?


3-93378
Брат
2003-12-31 10:26
2004.01.29
Как в таблице dBase создать поле Numeric (12,2)?


1-93544
Vik_Mix
2004-01-18 00:27
2004.01.29
Динамическое создание TImage


1-93517
Just newbie
2004-01-19 12:24
2004.01.29
Функция сравнение содержимого 2-х ListBox


1-93465
INTAARI
2004-01-12 10:47
2004.01.29
Как правильно вести log файл программы???