Форум: "Начинающим";
Текущий архив: 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