Главная страница
    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.008 c
7-93723
explorer
2003-11-14 07:44
2004.01.29
Как прогр. узнать где расположены папки Windows и Prog. Files


6-93602
Sanya-spb
2003-11-24 16:20
2004.01.29
IdTCPServer vs IdTCPClient висят??


1-93549
LeWorm
2004-01-17 22:28
2004.01.29
Запуск EXE или COM


1-93499
pASkdua
2004-01-16 18:14
2004.01.29
Как напечатат все содержимое SrcollBox-а?


7-93708
otar
2003-11-12 17:57
2004.01.29
В windows 98 работает а с win2k нет





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский