Главная страница
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.018 c
1-93440
Lkan
2004-01-16 07:16
2004.01.29
динамический массив


3-93407
SASH2
2004-01-05 11:50
2004.01.29
Чистка базы при определенном условии.


1-93441
Наиль
2004-01-16 13:36
2004.01.29
определение координат курсора мыши


1-93563
dima_matrix
2004-01-17 13:48
2004.01.29
Закрытие и уничтожение форм


1-93533
The Vizit0r!
2004-01-18 12:43
2004.01.29
Hex -> Integer