Форум: "WinAPI";
Текущий архив: 2004.01.29;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.01.29;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.007 c