Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
7-93714
Morgan128
2003-11-12 01:18
2004.01.29
Распознание текста


14-93677
Teren
2004-01-07 01:59
2004.01.29
Что за файл Thumbs.db


1-93445
вася
2004-01-16 12:20
2004.01.29
шифрование


4-93735
Иван
2003-11-20 14:40
2004.01.29
Восстановление иконки в трее.


1-93543
Mishenka
2004-01-17 02:39
2004.01.29
Как убрать с экрана панель задач?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский