谁能帮忙举个例子,用DELPHI写个简单例子,调用PING命令并且取回PING结果显示MSG BOX里,要通过管道技术取

[复制链接]
查看11 | 回复2 | 2011-3-19 06:18:55 | 显示全部楼层 |阅读模式
不要生成文本文件再读取文本文件的。
回复

使用道具 举报

千问 | 2011-3-19 06:18:55 | 显示全部楼层
<pre id=\"best-answer-content\" class=\"reply-text mb10\">// 自己写的,绝对可用
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TShowMethod = procedure(str: string) of object;
TForm1 = class(TForm)

Button1: TButton;

Memo1: TMemo;

Edit1: TEdit;

procedure Button1Click(Sender: TObject);
private

{ Private declarations }
public

{ Public declarations }

procedure ShowMethod(str: string);
end;

function RunCommand(const cmd: string; Show: TShowMethod = nil): string;
var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ShowMethod(str: string);
begin
Memo1.Lines.Add(str);
end;

function RunCommand(const cmd: string; Show: TShowMethod = nil): string;
var
hReadPipe,hWritePipe:THandle;
si:STARTUPINFO;
lsa:SECURITY_ATTRIBUTES;
pi:PROCESS_INFORMATION;
cchReadBuffer:DWORD;
pOutStr, pCMD:PChar;
res, strCMD:string;
begin
strcmd := \'cmd.exe /k \' cmd;
pOutStr := AllocMem(5000);
lsa.nLength := SizeOf(SECURITY_ATTRIBUTES);
lsa.lpSecurityDescriptor := nil;
lsa.bInheritHandle := True;
if not CreatePipe(hReadPipe, hWritePipe, @lsa, 0) then Exit;
FillChar(si, SizeOf(STARTUPINFO), 0);
si.cb:=sizeof(STARTUPINFO);
si.dwFlags:=(STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW);
si.wShowWindow:=SW_HIDE;
si.hStdOutput:=hWritePipe;

if not CreateProcess(nil, PChar(strCMD), nil, nil, true, 0, nil, nil, si, pi) then Exit;
while(true) do
begin

if not PeekNamedPipe(hReadPipe, pOutStr, 1, @cchReadBuffer, nil, nil) then break;

if cchReadBuffer0 then

begin

if not ReadFile(hReadPipe, pOutStr^, 4096, cchReadBuffer, nil) then break;

pOutStr[cchReadbuffer]:=chr(0);

if @Shownil then Show(pOutStr);

res := res pOutStr;

end else if(WaitForSingleObject(pi.hProcess ,0) = WAIT_OBJECT_0) then break;

Sleep(10);

Application.ProcessMessages;
end;
pOutStr[cchReadBuffer]:=chr(0);

CloseHandle(hReadPipe);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
CloseHandle(hWritePipe);
FreeMem(pOutStr);
Result := res;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
res: string;
begin
res := RunCommand(\'ping 192.168.0.1\', ShowMethod);
ShowMessage(res);
end;

end.

















<h4 class=\"ask\">追问





<pre class=\"replyask-text\" id=\"content-1796698\">RunCommand(\'ping 192.168.0.1\', ShowMethod);
如果这句话换成别的命令,也可以吗
回复

使用道具 举报

千问 | 2011-3-19 06:18:55 | 显示全部楼层
<pre class=\"replyask-text\" id=\"content-1857904\">换成什么都行
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行