实现以下功能:自己定一个命令,然后在cmd命令(控制台)下输入比如EventLog -a,然后就能查询到所有的windows事件,并显示到控制台上。我现在找了一些代码,不但功能差的很远,而且就连这仅有的一部分也还不起作用,请各位大虾们务必赐教,我想知道到底该怎么做,多谢,多谢!我现在找到的代码:unit main;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;type
TFrm_Main = class(TForm)
Timer: TTimer;
Memo1: TMemo;
Button1: TButton;
cbCmd: TComboBox;
procedure TimerTimer(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormShow(Sender: TObject); private
{ Private declarations }
procedure InitConsole;
function ReadFromPipe(Pipe: THandle): string;
procedure WriteToPipe(Pipe: THandle; Value: string);
public
{ Public declarations }
end;var
Frm_Main: TFrm_Main;implementation{$R *.dfm}procedure TFrm_Main.InitConsole;
var
Security: TSecurityAttributes;
start: TStartUpInfo;
ReadOut,WriteOut,ReadIn,WriteIn:THANDLE; //zxh debug 2008.11.14
ProcessInfo: TProcessInformation; //zxh debug 2008.11.14
begin
with Security do begin
nlength := SizeOf(TSecurityAttributes);
binherithandle := true;
lpsecuritydescriptor := nil;
end; Createpipe(ReadOut, WriteOut, @Security, 0);
Createpipe(ReadIn, WriteIn, @Security, 0); with Security do begin
nlength := SizeOf(TSecurityAttributes);
binherithandle := true;
lpsecuritydescriptor := nil;
end;
FillChar(Start, Sizeof(Start), #0);
start.cb := SizeOf(start);
start.hStdOutput := WriteOut;
start.hStdInput := ReadIn;
start.hStdError := WriteOut;
start.dwFlags := STARTF_USESTDHANDLES +
STARTF_USESHOWWINDOW;
start.wShowWindow := SW_HIDE;
CreateProcess(nil,
PChar('cmd'),
@Security,
@Security,
true,
NORMAL_PRIORITY_CLASS,
nil,
nil,
start,
ProcessInfo)
end; //==============================================================================
function TFrm_Main.ReadFromPipe(Pipe: THandle): string;
var
Buffer: PChar;
BytesRead: DWord;
const
{设置AllocMem的大小}
ReadBuffer = 2400;
begin
Result := '';
if GetFileSize(Pipe, nil) = 0 then Exit;
Buffer := AllocMem(ReadBuffer + 1);
repeat
BytesRead := 0;
ReadFile(Pipe, Buffer[0],
ReadBuffer, BytesRead, nil);
if BytesRead > 0 then begin
Buffer[BytesRead] := #0;
OemToAnsi(Buffer, Buffer);
Result := string(Buffer);
end;
until (BytesRead < ReadBuffer);
FreeMem(Buffer);
end;//==============================================================================procedure TFrm_Main.TimerTimer(Sender: TObject);
var
s: string;
ReadOut:THandle;
begin
s := ReadFromPipe(ReadOut);
if s <> '' then begin
Memo1.Lines.Text := Memo1.Lines.Text + s;
Memo1.SelStart := Length(Memo1.Lines.Text);
Memo1.SelLength := 0;
end;
end;//==============================================================================
procedure TFrm_Main.WriteToPipe(Pipe: THandle; Value: string);
var
len: integer;
BytesWrite: DWord;
Buffer: PChar;
begin
len := Length(Value) + 1;
Buffer := PChar(Value + #10);
WriteFile(Pipe, Buffer[0], len, BytesWrite, nil);
end;
//==============================================================================
procedure TFrm_Main.Button1Click(Sender: TObject);
var
WriteIn:THandle ;
begin
if Trim(cbCmd.Text) <> '' then begin
WriteToPipe(WriteIn, cbCmd.Text);
if cbCMD.ItemIndex > -1 then
cbCMD.Items.Delete(cbCMD.ItemIndex);
cbcmd.Items.Insert(0, cbCmd.Text);
cbCmd.Text:='';
end;
end;procedure TFrm_Main.FormShow(Sender: TObject);
begin
InitConsole;
end;end.
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;type
TFrm_Main = class(TForm)
Timer: TTimer;
Memo1: TMemo;
Button1: TButton;
cbCmd: TComboBox;
procedure TimerTimer(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormShow(Sender: TObject); private
{ Private declarations }
procedure InitConsole;
function ReadFromPipe(Pipe: THandle): string;
procedure WriteToPipe(Pipe: THandle; Value: string);
public
{ Public declarations }
end;var
Frm_Main: TFrm_Main;implementation{$R *.dfm}procedure TFrm_Main.InitConsole;
var
Security: TSecurityAttributes;
start: TStartUpInfo;
ReadOut,WriteOut,ReadIn,WriteIn:THANDLE; //zxh debug 2008.11.14
ProcessInfo: TProcessInformation; //zxh debug 2008.11.14
begin
with Security do begin
nlength := SizeOf(TSecurityAttributes);
binherithandle := true;
lpsecuritydescriptor := nil;
end; Createpipe(ReadOut, WriteOut, @Security, 0);
Createpipe(ReadIn, WriteIn, @Security, 0); with Security do begin
nlength := SizeOf(TSecurityAttributes);
binherithandle := true;
lpsecuritydescriptor := nil;
end;
FillChar(Start, Sizeof(Start), #0);
start.cb := SizeOf(start);
start.hStdOutput := WriteOut;
start.hStdInput := ReadIn;
start.hStdError := WriteOut;
start.dwFlags := STARTF_USESTDHANDLES +
STARTF_USESHOWWINDOW;
start.wShowWindow := SW_HIDE;
CreateProcess(nil,
PChar('cmd'),
@Security,
@Security,
true,
NORMAL_PRIORITY_CLASS,
nil,
nil,
start,
ProcessInfo)
end; //==============================================================================
function TFrm_Main.ReadFromPipe(Pipe: THandle): string;
var
Buffer: PChar;
BytesRead: DWord;
const
{设置AllocMem的大小}
ReadBuffer = 2400;
begin
Result := '';
if GetFileSize(Pipe, nil) = 0 then Exit;
Buffer := AllocMem(ReadBuffer + 1);
repeat
BytesRead := 0;
ReadFile(Pipe, Buffer[0],
ReadBuffer, BytesRead, nil);
if BytesRead > 0 then begin
Buffer[BytesRead] := #0;
OemToAnsi(Buffer, Buffer);
Result := string(Buffer);
end;
until (BytesRead < ReadBuffer);
FreeMem(Buffer);
end;//==============================================================================procedure TFrm_Main.TimerTimer(Sender: TObject);
var
s: string;
ReadOut:THandle;
begin
s := ReadFromPipe(ReadOut);
if s <> '' then begin
Memo1.Lines.Text := Memo1.Lines.Text + s;
Memo1.SelStart := Length(Memo1.Lines.Text);
Memo1.SelLength := 0;
end;
end;//==============================================================================
procedure TFrm_Main.WriteToPipe(Pipe: THandle; Value: string);
var
len: integer;
BytesWrite: DWord;
Buffer: PChar;
begin
len := Length(Value) + 1;
Buffer := PChar(Value + #10);
WriteFile(Pipe, Buffer[0], len, BytesWrite, nil);
end;
//==============================================================================
procedure TFrm_Main.Button1Click(Sender: TObject);
var
WriteIn:THandle ;
begin
if Trim(cbCmd.Text) <> '' then begin
WriteToPipe(WriteIn, cbCmd.Text);
if cbCMD.ItemIndex > -1 then
cbCMD.Items.Delete(cbCMD.ItemIndex);
cbcmd.Items.Insert(0, cbCmd.Text);
cbCmd.Text:='';
end;
end;procedure TFrm_Main.FormShow(Sender: TObject);
begin
InitConsole;
end;end.
没听懂~~就事论事写个例子吧~procedure Button1Click(Sender: TObject);
begin
winexec('cmd /EventLog -a',SW_show);
end;