Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2016.04.03;
Скачать: [xml.tar.bz2];

Вниз

console   Найти похожие ветки 

 
Dennis I. Komarov ©   (2014-09-09 14:17) [0]

Приветище!
Помнится мне была ветка, но не помню чем дело закончилось...
Вопрос, как поймать (перенаправить себе) output консоли? Консоль запускается из приложения будь то cmd или exe.


 
brother ©   (2014-09-09 15:06) [1]

http://forum.codecall.net/topic/72472-execute-a-console-program-and-capture-its-output/
оно?


 
virex(work)   (2014-09-09 15:19) [2]

чтото типа:

{ VirEx (c) [22:27 28.10.2005]
модуль для полноценной работы с CMD интерпретатором (Windows XP)
}
unit CMDMode;

interface

uses
 Windows;

//function RunConsoleApp(CommandLine: PChar;var Output: array of PChar):boolean;

//устанавливаем командный режим (запускаем CMD)
function CreateCMDMode(CommandLine: PChar):boolean;

//тут и так всё ясно
procedure CloseCMDMode;

//посылаем интерпретатору CMD команду (например dir)
function RunCMDCommand(Command:PChar): Boolean;

//читаем строки исполненой команды (после последней вводимой команды)
procedure ReadCMDResult(var Output:PChar);

implementation
var
 //для CreateProcess
 sa : TSECURITYATTRIBUTES;
 si : TSTARTUPINFO;
 pi : TPROCESSINFORMATION;

 //дескрипторы каналов ввода/вывода
 PipeStdInRead,
 PipeStdInWrite,
 PipeStdOutRead,
 PipeStdOutWrite
 :THandle;

function CreateCMDMode(CommandLine: PChar):boolean;
var
tmp1,tmp2:THandle;
begin
sa.nLength := sizeof(sa);
sa.bInheritHandle := true;
sa.lpSecurityDescriptor := nil;

//делаем каналы ввода/вывода
CreatePipe(PipeStdInRead, PipeStdInWrite, @sa, 0);
CreatePipe(PipeStdOutRead, PipeStdOutWrite, @sa, 0);

DuplicateHandle(GetCurrentProcess(), PipeStdInWrite, GetCurrentProcess(), @Tmp1, 0, False, DUPLICATE_SAME_ACCESS);
DuplicateHandle(GetCurrentProcess(), PipeStdOutRead, GetCurrentProcess(), @Tmp2, 0, False, DUPLICATE_SAME_ACCESS);

CloseHandle(PipeStdInWrite);
CloseHandle(PipeStdOutRead);

PipeStdInWrite:=Tmp1;
PipeStdOutRead:=Tmp2;

zeromemory(@si,SizeOf(si));
si.cb := SizeOf(si);

si.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
si.wShowWindow := SW_HIDE;
si.hStdInput :=PipeStdInRead;
si.hStdOutput := PipeStdOutWrite;

Result:=CreateProcess(nil,
     PChar(CommandLine),       // command line
     nil,          // process security attributes
     nil,          // primary thread security attributes
     TRUE,         // handles are inherited
     0,            // creation flags
     nil,          // use parent"s environment
     nil,          // use parent"s current directory
     si,  // STARTUPINFO pointer
     pi);  // receives PROCESS_INFORMATION
end;

procedure CloseCMDMode;
begin
try
CloseHandle(PipeStdInRead);
CloseHandle(PipeStdInWrite);
CloseHandle(PipeStdOutRead);
CloseHandle(PipeStdOutWrite);
CloseHandle(pi.hThread);//сначало закрываем "нить"
CloseHandle(pi.hProcess);//и только потом сам процесс
except
end;
end;

function RunCMDCommand(Command:PChar): Boolean;
var
dwWritten, BufSize: DWORD;
begin
 Command:=PChar(Command+#10#13);
 BufSize:=Length(Command);
 Result:=WriteFile(PipeStdInWrite, Command^, BufSize, dwWritten, Nil);
 Result:=Result and (BufSize = dwWritten);
 //freemem(s);
 //ZeroMemory(@s,Length(s));
end;

procedure ReadCMDResult(var Output: PChar);
var
i: Integer;
dwRead, BufSize, DesBufSize: DWORD;
 Res: Boolean;
begin
try
 BufSize:=0;
   repeat

     for i:=0 to 9 do
      begin
      Res:=PeekNamedPipe(PipeStdOutRead, nil, 0, nil, @DesBufSize, nil);
        Res:=Res and (DesBufSize > 0);
         if Res then
           Break;
         Sleep(30);
       end;
     if Res then
      begin
        If DesBufSize > BufSize then
          begin
            //if PChar(Output^)<>nil then FreeMem(Output);
             //for i:=0 to Length(Output) do Output[i]:=#0;
            GetMem(Output, DesBufSize);
             BufSize:=DesBufSize;
           end;
     Res:=ReadFile(PipeStdOutRead, Output^, BufSize, dwRead, Nil);
       end;
   until not Res;
 except
 end;
end;

end.


использование:

CreateCMDMode("cmd");

if RunCMDCommand(PChar(buff)) then begin
 ReadCMDResult(CMDLog);
 getmem(CMDLogTmp,Length(CMDLog));
 OemToChar(CMDLog,CMDLogTmp);//переводим в удобочитаемый вид
end;

CloseCMDMode;


 
brother ©   (2014-09-09 15:51) [3]

> (Windows XP)

а выше работать будет?


 
Dennis I. Komarov ©   (2014-09-09 16:37) [4]

Вечерком на дельфи проверю, спасибо!


 
Dennis I. Komarov ©   (2014-09-09 20:04) [5]

Вот ты черт... Дельфи нету... Как я отстал уже от этой жизни :)

Пойду какой-нить XE скачаю, хоть пощупаю :)
На CelM 430 (1.7GHz) что хоть работать будет?



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2016.04.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.002 c
1-1337322575
Irisss
2012-05-18 10:29
2016.04.03
Выпадающий список в DBGrid с FibPlus


15-1437982657
Pavia
2015-07-27 10:37
2016.04.03
диграммы из UML


2-1410257863
Dennis I. Komarov
2014-09-09 14:17
2016.04.03
console


15-1437773402
Юрий
2015-07-25 00:30
2016.04.03
С днем рождения ! 25 июля 2015 суббота


2-1409745815
dmk
2014-09-03 16:03
2016.04.03
Системный аналог





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