delphi调用命令行命令并获取返回信息  
官方Delphi 学习QQ群: 682628230(三千人)
频道

delphi调用命令行命令并获取返回信息


procedure CmdExecAndView(FileName: string; memo: TMemo);
procedure _AddInfo(mmInfo:TMemo; S: string; var line: string); 
var 
    i, p: Integer;
begin 
    if mmInfo.Lines.Count > 800 then 
      mmInfo.Lines.Clear;
    for i := 0 to Length(S) - 1 do 
      if S[i] = #13 then S[i] := ' '; 
    line := line + S;
    p := Pos(#10, line); 
    if p > 0 then 
    begin 
      mmInfo.Lines.Add(Copy(line, 1, p - 1)); 
      line := Copy(line, p + 1, Length(line) - p); 
    end; 
end; 
var 
  hReadPipe, hWritePipe: THandle; 
  si: STARTUPINFO; 
  lsa: SECURITY_ATTRIBUTES; 
  pi: PROCESS_INFORMATION; 
  cchReadBuffer: DWORD; 
  ph: PChar; 
  fname: PChar; 
  line: string; 
begin 
    fname := allocmem(1024); 
    ph := AllocMem(1024); 
    lsa.nLength := sizeof(SECURITY_ATTRIBUTES); 
    lsa.lpSecurityDescriptor := nil; 
    lsa.bInheritHandle := True; 
    if CreatePipe(hReadPipe, hWritePipe, @lsa, 0) = false 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; 
    si.hStdError := hWritePipe; 
    StrPCopy(fname, FileName); 
    if CreateProcess(nil, fname, nil, nil, true, 0, nil, nil, si, pi) = False then 
    begin 
        FreeMem(ph); 
        FreeMem(fname); 
        Exit; 
    end; 
    CloseHandle(hWritePipe); 
    while (true) do 
    begin 
        if not PeekNamedPipe(hReadPipe, ph, 1, @cchReadBuffer, nil, nil) then break; 
        if cchReadBuffer <> 0 then 
        begin 
            if ReadFile(hReadPipe, ph^, 512, cchReadBuffer, nil) = false then break; 
            ph[cchReadbuffer] := chr(0); 
            _AddInfo(memo, ph, line); 
        end 
        else if (WaitForSingleObject(pi.hProcess, 0) = WAIT_OBJECT_0) then break; 
        Application.ProcessMessages; 
        Sleep(200); 
    end; 
    ph[cchReadBuffer] := chr(0); 
    _AddInfo(memo, ph, line); 
    CloseHandle(hReadPipe); 
    CloseHandle(pi.hThread); 
    CloseHandle(pi.hProcess); 
    FreeMem(ph); 
    FreeMem(fname); 
end;
用的时候就  CmdExecAndView('ping 202.100.197.50 -t',Memo1);

推荐分享
图文皆来源于网络,内容仅做公益性分享,版权归原作者所有,如有侵权请告知删除!
 

Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号

执行时间: 0.038766860961914 seconds