![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
доброе время суток.
вот возник вопрос как перехватить консоль суть в том чтоб memo полностью стало консолью каторую я хочу перехватить и реализовать работу с файломи консоль это colinux запускающийся с параметром Код:
colinux-daemon.exe -t nt @server/server.conf fastboot nogui Скрин работы с файломи: http://s012.radikal.ru/i321/1107/5a/13387010e367.jpg =================================== ======================= Открытие архива .img нужно открыть файл из этого образа 123.img и отредактировать строки в нём чтоб они выводились в Edit1,Edit2,Edit3 и т.п место расположение файла мне изветно если это чтото изменит скрин консоли colinux при запуски http://s015.radikal.ru/i332/1107/7d/26ac1525ecf8.jpg и скрин файла http://s014.radikal.ru/i326/1107/9c/20c6905b07ca.jpg Если вам нетрудно поделитесь исходником или кодом=( За рание спосибо. |
|
#2
|
||||
|
||||
|
Лови модуль, буквально вчера писал. Точно знаю что работает на Delphi XE, про остальные версии 100% утверждать не берусь, но теоретически работать должно.
Код:
unit ConsoleAppRunner;
interface
uses
Classes;
procedure RunConsoleApplication(CmdLine,Params:AnsiString;OutStrings:TStrings);
implementation
uses
Windows,AnsiStrings;
procedure RunConsoleApplication(CmdLine,Params:AnsiString;OutStrings:TStrings);
var
securityattributes: TSecurityAttributes;
startupinfo: TStartupInfoA;
processinformation: TProcessInformation;
hPipeInputRead: THandle;
hPipeInputWrite: THandle;
hPipeOutputRead: THandle;
hPipeOutputWrite: THandle;
WaitResult:Cardinal;
buf: array [0..1023] of AnsiChar;
dummy: Cardinal;
begin
OutStrings.Append(#13#10);
securityattributes.nLength:=SizeOf(TSecurityAttributes);
securityattributes.lpSecurityDescriptor:=nil;
securityattributes.bInheritHandle:=True;
CreatePipe(hPipeInputRead, hPipeInputWrite, @securityattributes, 0);
CreatePipe(hPipeOutputRead, hPipeOutputWrite, @securityattributes, 0);
ZeroMemory(@startupinfo, SizeOf(TStartupInfo));
ZeroMemory(@processinformation, SizeOf(TProcessInformation));
startupinfo.cb:=SizeOf(TStartupInfo);
startupinfo.dwFlags:=STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
startupinfo.wShowWindow:=SW_HIDE;
startupinfo.hStdInput:=hPipeInputRead;
startupinfo.hStdOutput:=hPipeOutputWrite;
startupinfo.hStdError:=hPipeOutputWrite;
OutStrings.BeginUpdate;
OutStrings.Append(CmdLine+' '+Params);
OutStrings.EndUpdate;
if CreateProcessA(nil, PAnsiChar(CmdLine+' '+Params), nil, nil, True, CREATE_NEW_CONSOLE,
nil, PAnsiChar(AnsiStrings.ExtractFileDir(CmdLine)), startupinfo, processinformation) then
begin
repeat
WaitResult:=WaitForSingleObject(processinformation.hProcess, 100);
if ReadFile(hPipeOutputRead, buf, Length(buf), dummy, nil) then
begin
OemToAnsiBuff(buf, buf, dummy);
OutStrings.BeginUpdate;
OutStrings.Text:=OutStrings.Text+Copy(buf, 1, dummy);
OutStrings.EndUpdate;
end;
until WaitResult<>WAIT_TIMEOUT;
CloseHandle(processinformation.hProcess);
end;
CloseHandle(hPipeInputWrite);
CloseHandle(hPipeInputRead);
CloseHandle(hPipeOutputWrite);
CloseHandle(hPipeOutputRead);
end;
end.CmdLine - exe-файл (указываем полный путь, далее этот путь будет использоваться как рабочий каталог) Params - параметры OutStrings - объект для вывода результатов (в самом простом варианте это Memo1.Lines) |
|
#3
|
||||
|
||||
|
Код:
procedure RunConsoleApplication(CmdLine,Params:AnsiString;OutStrings:TStrings);
var
securityattributes: TSecurityAttributes;
startupinfo: TStartupInfoA;//тут ругается и после этого на всё остальное
processinformation: TProcessInformation;
hPipeInputRead: THandle;
hPipeInputWrite: THandle;
hPipeOutputRead: THandle;
hPipeOutputWrite: THandle;
WaitResult:Cardinal;
buf: array [0..1023] of AnsiChar;
dummy: Cardinal;
begin
OutStrings.Append(#13#10);
securityattributes.nLength:=SizeOf(TSecurityAttributes);
securityattributes.lpSecurityDescriptor:=nil;
securityattributes.bInheritHandle:=True;
CreatePipe(hPipeInputRead, hPipeInputWrite, @securityattributes, 0);
CreatePipe(hPipeOutputRead, hPipeOutputWrite, @securityattributes, 0);
ZeroMemory(@startupinfo, SizeOf(TStartupInfo));
ZeroMemory(@processinformation, SizeOf(TProcessInformation));
startupinfo.cb:=SizeOf(TStartupInfo);
startupinfo.dwFlags:=STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
startupinfo.wShowWindow:=SW_HIDE;
startupinfo.hStdInput:=hPipeInputRead;
startupinfo.hStdOutput:=hPipeOutputWrite;
startupinfo.hStdError:=hPipeOutputWrite;
OutStrings.BeginUpdate;
OutStrings.Append(CmdLine+' '+Params);
OutStrings.EndUpdate;
if CreateProcessA(nil, PAnsiChar(CmdLine+' '+Params), nil, nil, True, CREATE_NEW_CONSOLE,
nil, PAnsiChar(AnsiStrings.ExtractFileDir(CmdLine)), startupinfo, processinformation) then
begin
repeat
WaitResult:=WaitForSingleObject(processinformation.hProcess, 100);
if ReadFile(hPipeOutputRead, buf, Length(buf), dummy, nil) then
begin
OemToAnsiBuff(buf, buf, dummy);
OutStrings.BeginUpdate;
OutStrings.Text:=OutStrings.Text+Copy(buf, 1, dummy);
OutStrings.EndUpdate;
end;
until WaitResult<>WAIT_TIMEOUT;
CloseHandle(processinformation.hProcess);
end;
CloseHandle(hPipeInputWrite);
CloseHandle(hPipeInputRead);
CloseHandle(hPipeOutputWrite);
CloseHandle(hPipeOutputRead);
end;
end.вот=\ |
|
#4
|
||||
|
||||
|
Замени TStartupInfoA на TStartupInfo
|
|
#5
|
||||
|
||||
|
http://i027.radikal.ru/1107/78/80f1409ff0e2.jpg
вот чё выдаёт щяс |
|
#6
|
||||
|
||||
|
Убери AnsiStrings из Uses, он мне только для XE нужен был.
|
|
#7
|
||||
|
||||
|
http://s61.radikal.ru/i171/1107/94/a04d12682f74.jpg
В вложении исходник ато я чёт ваше запутался=\ Последний раз редактировалось bender42, 23.07.2011 в 16:06. |
|
#8
|
||||
|
||||
|
|
|
#9
|
||||
|
||||
|
Допилил я таки модуль для запуска консольных приложений, чтобы он нормально работал в XE
Кому не влом, протестируйте на семерке к примеру, ну или на любой дельфе которая не юникодовская. Код:
unit ConsoleAppRunner;
interface
uses
Classes;
procedure RunConsoleApplication(CmdLine,Params:String;OutStrings:TStrings);
implementation
uses
SysUtils,Windows;
const
UnprintableSymbols = [
#$00,#$01,#$02,#$03,#$04,#$05,#$06,#$07,#$08,#$09,#$0A,#$0B,#$0C,#$0D,#$0E,#$0F,
#$10,#$11,#$12,#$13,#$14,#$15,#$16,#$17,#$18,#$19,#$1A,#$1B,#$1C,#$1D,#$1E,#$1F,
#$7F
];
type
TAnsiBuf = array [0..1023] of AnsiChar;
TCharBuf = array [0..1023] of Char;
procedure MoveLeft(var Data:TAnsiBuf; From,Len,Shift:integer);
var
i:integer;
begin
for i := From to From+Len do
Data[i]:=Data[i-Shift];
end;
procedure AnsiBufToCharBuf(AnsiBuf:TAnsiBuf;var CharBuf:TCharBuf;Len:integer);
var
i:integer;
begin
for I := 0 to Len do
begin
if CharInSet(AnsiBuf[i],UnprintableSymbols) then
CharBuf[i]:=Char(AnsiBuf[i])
else
OemToChar(@AnsiBuf[i],@CharBuf[i]);
end;
end;
procedure RunConsoleApplication(CmdLine,Params:String;OutStrings:TStrings);
var
securityattributes: TSecurityAttributes;
startupinfo: TStartupInfo;
processinformation: TProcessInformation;
hPipeInputRead: THandle;
hPipeInputWrite: THandle;
hPipeOutputRead: THandle;
hPipeOutputWrite: THandle;
WaitResult:Cardinal;
AnsiBuf: TAnsiBuf;
CharBuf: TCharBuf;
dummy: Cardinal;
s:string;
begin
// OutStrings.Append(#13#10); //<---------
securityattributes.nLength:=SizeOf(TSecurityAttributes);
securityattributes.lpSecurityDescriptor:=nil;
securityattributes.bInheritHandle:=True;
CreatePipe(hPipeInputRead, hPipeInputWrite, @securityattributes, 0);
CreatePipe(hPipeOutputRead, hPipeOutputWrite, @securityattributes, 0);
ZeroMemory(@startupinfo, SizeOf(TStartupInfo));
ZeroMemory(@processinformation, SizeOf(TProcessInformation));
with startupinfo do
begin
cb:=SizeOf(TStartupInfo);
dwFlags:=STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
wShowWindow:=SW_HIDE;
hStdInput:=hPipeInputRead;
hStdOutput:=hPipeOutputWrite;
hStdError:=hPipeOutputWrite;
end;
OutStrings.BeginUpdate;
OutStrings.Append(CmdLine+' '+Params);
OutStrings.EndUpdate;
if CreateProcess(nil, PChar(CmdLine+' '+Params), nil, nil, True, CREATE_NEW_CONSOLE,
nil, PChar(ExtractFileDir(CmdLine)), startupinfo, processinformation) then
begin
repeat
WaitResult:=WaitForSingleObject(processinformation.hProcess, 100);
if ReadFile(hPipeOutputRead, AnsiBuf, Length(AnsiBuf), dummy, nil) then
begin
AnsiBufToCharBuf(AnsiBuf, CharBuf, dummy);
OutStrings.BeginUpdate;
OutStrings.Text:=OutStrings.Text+Copy(CharBuf, 1, dummy);
// if Pos(#8,OutStrings.Text)>0 then //<---------
// begin //<---------
// s:=OutStrings.Text; //<---------
// Delete(s,Pos(#8,s)-3,4); //<---------
// OutStrings.Text:=s; //<---------
// end; //<---------
OutStrings.EndUpdate;
end;
until WaitResult<>WAIT_TIMEOUT;
CloseHandle(processinformation.hProcess);
end
else
begin
OutStrings.BeginUpdate;
OutStrings.Append(SysErrorMessage(GetLastError));
OutStrings.EndUpdate;
end;
CloseHandle(hPipeInputWrite);
CloseHandle(hPipeInputRead);
CloseHandle(hPipeOutputWrite);
CloseHandle(hPipeOutputRead);
end;
end.пример вызова: Код:
uses ConsoleAppRunner;
...
RunConsoleApplication('c:\windows\system32\ping.exe','192.168.104.104',ListBox1.Items); |
|
#10
|
||||
|
||||
|
CharInSet появилась в Дельфи 2009.
|
|
#11
|
||||
|
||||
|
Ну это не трудно поправить.
|
|
#12
|
||||
|
||||
|
После доработки запускается в 5 и 7 Дельфи.
P.S. По указанному адресу, отказали в доступе. ![]() Последний раз редактировалось angvelem, 04.08.2011 в 13:32. |
|
#13
|
||||
|
||||
|
Склероз.
Для использования CharInSet в не юникодных версиях Дельфи, добавляем:Код:
unit util;
{$H+,B-,R-}
interface
uses
Windows, Messages;
{$I Common.inc}
type
TSysCharSet = set of AnsiChar;
TCharSet = TSysCharSet;
//======================= SysUtils =========================
function CharInSet(C : AnsiChar; const CharSet : TSysCharSet) : Boolean; overload;{$IFDEF D10} inline;{$ENDIF}
function CharInSet(C : WideChar; const CharSet : TSysCharSet) : Boolean; overload;{$IFDEF D10} inline;{$ENDIF}
implementation
const
{$IFDEF D5}
CSTR_EQUAL = 2;
{$ENDIF}
//---------------------------------------------------------
// SysUtils
//---------------------------------------------------------
function CharInSet(C : AnsiChar; const CharSet : TSysCharSet) : Boolean;
begin
Result := C in CharSet;
end;
//---------------------------------------------------------
function CharInSet(C : WideChar; const CharSet : TSysCharSet) : Boolean;
begin
Result := (C < #$0100) and (AnsiChar(C) in CharSet);
end;
//---------------------------------------------------------
end.Код:
{$IFDEF VER100} { Borland Delphi 3.0 }
{$DEFINE D3}
{$ENDIF}
{$IFDEF VER120} { Borland Delphi 4.0 }
{$DEFINE D3}
{$DEFINE D4}
{$ENDIF}
{$IFDEF VER130} { Borland Delphi 5.0 }
{$DEFINE D3}
{$DEFINE D4}
{$DEFINE D5}
{$ENDIF}
{$IFDEF VER140} { Borland Delphi 6.0 }
{$DEFINE D3}
{$DEFINE D4}
{$DEFINE D5}
{$DEFINE D6}
{$ENDIF}
{$IFDEF VER150} { Borland Delphi 7.0 }
{$DEFINE D3}
{$DEFINE D4}
{$DEFINE D5}
{$DEFINE D6}
{$DEFINE D7}
{$ENDIF}
{$IFDEF VER180} { Borland Delphi 2006 }
{$DEFINE D3}
{$DEFINE D4}
{$DEFINE D5}
{$DEFINE D6}
{$DEFINE D7}
{$DEFINE D10}
{$ENDIF}
{$IFDEF VER200} { Borland Delphi 2009 }
{$DEFINE D3}
{$DEFINE D4}
{$DEFINE D5}
{$DEFINE D6}
{$DEFINE D7}
{$DEFINE D10}
{$DEFINE D2009}
{$ENDIF}
{$IFDEF D7}
{$WARN SYMBOL_PLATFORM OFF}
{$WARN UNSAFE_TYPE OFF}
{$WARN UNSAFE_CODE OFF}
// These flags requires library DbgHelp.dll on Windows NT 4.0
// and Windows 95/98/Me.
{$SETPEFLAGS IMAGE_FILE_RELOCS_STRIPPED or
IMAGE_FILE_DEBUG_STRIPPED or
IMAGE_FILE_LINE_NUMS_STRIPPED or
IMAGE_FILE_LOCAL_SYMS_STRIPPED or
IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP or
IMAGE_FILE_NET_RUN_FROM_SWAP}
{$ENDIF}
{$IFDEF D2009}
{$WARN IMPLICIT_STRING_CAST OFF}
{$WARN IMPLICIT_STRING_CAST_LOSS OFF}
{$ENDIF} |