| | | | |
Перенаправление вывода консольной программы | Полный текст материала
Цитата или краткий комментарий: «... Понадобилось мне отобразить работу консольной программы в каком-нибудь Memo, а саму консоль не показывать. ...» |
Важно:- Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
- Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
- При голосовании учитывайте уровень, на который расчитан материал. "Интересность и полезность" имеет смысл оценивать относительно того, кому именно предназначался материал.
- Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.
Добавить свое мнение.
| | Содержит полезные и(или) интересные сведения | [1] | 6 | 85.7% | | | | Ничего особенно нового и интересного | [2] | 0 | 0% | | | | Написано неверно (обязательно укажите почему) | [3] | 1 | 14.3% | | Всего проголосовали: 7 | | | Все понятно, материал читается легко | [1] | 5 | 83.3% | | | | Есть неясности в изложении | [2] | 1 | 16.7% | | | | Непонятно написано, трудно читается | [3] | 0 | 0% | | Всего проголосовали: 6 |
[Ввод/вывод (StdIn/StdOut)]
Отслеживать это обсуждение
Всего сообщений: 1015-08-2012 11:45function GetDosOutput(const CommandLine: string): string;
var
SA: TSecurityAttributes;
SI: TStartupInfo;
PI: TProcessInformation;
StdOutPipeRead, StdOutPipeWrite: THandle;
WasOK: Boolean;
Buffer: array[0..255] of AnsiChar;
BytesRead: Cardinal;
cmdLine, Line: string;
begin
Application.ProcessMessages;
with SA do
begin
nLength := SizeOf(SA);
bInheritHandle := True;
lpSecurityDescriptor := nil;
end;
CreatePipe(StdOutPipeRead, StdOutPipeWrite, @SA, 0);
try
with SI do
begin
FillChar(SI, SizeOf(SI), 0);
cb := SizeOf(SI);
dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
wShowWindow := SW_HIDE;
hStdInput := GetStdHandle(STD_INPUT_HANDLE);
hStdOutput := StdOutPipeWrite;
hStdError := StdOutPipeWrite;
end;
cmdLine := PChar('C:\windows\system32\' + '\cmd.exe /C ' + CommandLine);
WasOK := CreateProcess(nil, PChar(cmdLine), nil, nil, True, 0, nil, PChar('C' + ':\'), SI, PI);
CloseHandle(StdOutPipeWrite);
if WasOK then
try
Line := '';
repeat
WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil);
if BytesRead > 0 then
begin
Buffer[BytesRead] := #0;
OemToCharA(buffer, buffer);
Line := Line + string(AnsiString(Buffer));
end;
until not WasOK or (BytesRead = 0);
WaitForSingleObject(PI.hProcess, INFINITE);
finally
CloseHandle(PI.hThread);
CloseHandle(PI.hProcess);
end;
finally
result := Line;
CloseHandle(StdOutPipeRead);
end;
end; |
|
12-06-2006 09:07Сергей ответь в Туркменистан тел + 99 132 45 70 16, E-mail: mclahlan@mail.ru |
|
12-06-2006 09:00Сергей ответь в Туркменистан
Олег |
|
11-04-2006 18:47Спасибо автору. очень помогло.
первый найденный мною
полностью работаюший (без дополнительной наладки)
пример перехвата консольного вывода.
|
|
15-02-2004 20:35Мне очень помогла в работе данная статья. Особенно приписка по cmd.exe. Благодарен автору за его работу. |
|
06-12-2003 02:56Здорово, функция удобна, но...
Sleep(100);
100 - это что, магическое число, за которое выполняется любое консольное приложение?
Думаю лучше убрать эту строчку и добавить WaitForSingleObject:
if CreateProcess(nil, PChar(CommandLine), nil, nil, True, 0, nil, nil, SI, PI) then begin
>>WaitForSingleObject(PI.hProcess, INFINITE);
CloseHandle(PI.hProcess); |
|
27-08-2003 12:32Хотелось добавить, что после использования трубы лучше закрывать.
Это:
end; // if CreateProcess
end;
Заменить на это:
end; // if CreateProcess
CloseHandle(tRead);
CloseHandle(cWrite);
end;
|
|
03-06-2003 10:14Прошу прощения, забыл подписать сообщение от 03.06.2003 10:10:11
|
|
03-06-2003 10:10CommandLine:=''cmd.exe /c ''+CommandLine
Так не зелательно поступать, имя командного процессора надо брать из системной переменной COMCPEC, поскольку оно может быть другим и не обязательно CMD.EXE или COMMAND.COMСообщение не подписано |
|
02-06-2003 19:46Это все понятно и уже неинтересно. А вот как читать экранный буфер "чужого" консольного приложения, которое не создается через CreateProcess? А еще бы хотелось наполнять stdin этого "чужого" приложения (то есть получить полное управеление). |
|
|
|