
29.03.2011, 09:23
|
 |
Let Me Show You
|
|
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
|
|
вот пример GUI консоли. запускает cmd. для побаловаться можно вводить dos-команды: dir, ver, blablabla...
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TReadThread = class(TThread)
private
buf: array [0..255] of Char;
dummy: Cardinal;
procedure UpdateForm;
protected
procedure Execute; override;
public
constructor Create;
end;
TFormMain = class(TForm)
MemoConsole: TMemo;
EditText: TEdit;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure EditTextKeyPress(Sender: TObject; var Key: Char);
private
hPipeInputRead: THandle;
hPipeInputWrite: THandle;
hPipeOutputRead: THandle;
hPipeOutputWrite: THandle;
hProcess: THandle;
readthread: TReadThread;
public
end;
var
FormMain: TFormMain;
implementation
{$R *.dfm}
procedure TFormMain.FormCreate(Sender: TObject);
var
securityattributes: TSecurityAttributes;
startupinfo: TStartupInfo;
processinformation: TProcessInformation;
begin
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;
CreateProcess(nil, PChar('cmd'), nil, nil, True, CREATE_NEW_CONSOLE, nil, nil, startupinfo, processinformation);
hProcess:=processinformation.hProcess;
readthread:=TReadThread.Create;
end;
procedure TFormMain.FormDestroy(Sender: TObject);
begin
TerminateProcess(hProcess, 0);
CloseHandle(hProcess);
CloseHandle(hPipeInputRead);
CloseHandle(hPipeInputWrite);
CloseHandle(hPipeOutputRead);
CloseHandle(hPipeOutputWrite);
readthread.Terminate;
readthread.WaitFor;
readthread.Free;
end;
procedure TFormMain.EditTextKeyPress(Sender: TObject; var Key: Char);
var
buf: array [0..255] of Char;
dummy: Cardinal;
begin
if Key=#13 then
begin
StrPCopy(buf, EditText.Text+#13#10);
WriteFile(hPipeInputWrite, buf, Length(EditText.Text)+2, dummy, nil);
EditText.Clear;
end;
end;
{ TReadThread }
constructor TReadThread.Create;
begin
inherited Create(True);
FreeOnTerminate:=False;
Resume;
end;
procedure TReadThread.Execute;
begin
while not Terminated do
if ReadFile(FormMain.hPipeOutputRead, buf, 256, dummy, nil) then Synchronize(UpdateForm);
end;
procedure TReadThread.UpdateForm;
begin
OemToAnsiBuff(buf, buf, dummy);
FormMain.MemoConsole.Text:=FormMain.MemoConsole.Text+Copy(buf, 1, dummy);
end;
end.
http://data.cod.ru/95453
__________________
Пишу программы за еду.
__________________
|