delphi XE版本 运行cmd命令,并取得输出字符


本文整理自网络,侵删。

 
procedure CheckResult(b: Boolean);  
begin  
  if not b then  
    raise Exception.Create(SysErrorMessage(GetLastError));  
end;  
  
function RunDOS(const CommandLine: string): string;  
var  
  HRead, HWrite: THandle;  
  StartInfo: TStartupInfoA;  
  ProceInfo: TProcessInformation;  
  b: Boolean;  
  sa: TSecurityAttributes;  
  inS: THandleStream;  
  sRet: TStrings;  
begin  
  Result := '';  
  FillChar(sa, sizeof(sa), 0);  
  // 设置允许继承,否则在NT和2000下无法取得输出结果  
  sa.nLength := sizeof(sa);  
  sa.bInheritHandle := True;  
  sa.lpSecurityDescriptor := nil;  
  b := CreatePipe(HRead, HWrite, @sa, 0);  
  CheckResult(b);  
  
  FillChar(StartInfo, sizeof(StartInfo), 0);  
  StartInfo.cb := sizeof(StartInfo);  
  StartInfo.wShowWindow := SW_HIDE;  
  // 使用指定的句柄作为标准输入输出的文件句柄,使用指定的显示方式  
  StartInfo.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;  
  StartInfo.hStdError := HWrite;  
  StartInfo.hStdInput := GetStdHandle(STD_INPUT_HANDLE); // HRead;  
  StartInfo.hStdOutput := HWrite;  
  
  b := CreateProcessA(nil, // lpApplicationName: PChar  
    PAnsiChar(AnsiString(CommandLine)), // lpCommandLine: PAnsiChar  
    nil, // lpProcessAttributes: PSecurityAttributes  
    nil, // lpThreadAttributes: PSecurityAttributes  
    True, // bInheritHandles: BOOL  
    CREATE_NEW_CONSOLE, nil, nil, StartInfo, ProceInfo);  
  
  CheckResult(b);  
  WaitForSingleObject(ProceInfo.hProcess, INFINITE);  
  
  inS := THandleStream.Create(HRead);  
  if inS.Size > 0 then  
  begin  
    sRet := TStringList.Create;  
    sRet.LoadFromStream(inS);  
    Result := sRet.Text;  
    sRet.Free;  
  end;  
  inS.Free;  
  
  CloseHandle(HRead);  
  CloseHandle(HWrite);  
end;  
测试
memo1.text := RunDOS('ping www.baidu.com');  

D7改为
b := CreateProcess(nil, //lpApplicationName: PChar
    PChar(CommandLine), //lpCommandLine: PChar
    nil, //lpProcessAttributes: PSecurityAttributes
    nil, //lpThreadAttributes: PSecurityAttributes
    True, //bInheritHandles: BOOL
    CREATE_NEW_CONSOLE,
    nil,
    nil,
    StartInfo,
    ProceInfo);


XE强制 AnsiChar 

相关阅读 >>

Delphi中读取硬盘的物理序列号

Delphi unidbtreegrid判断点击折叠事件

windows7下使用Delphi7的方法

Delphi tadocommand 中文使用说明

Delphi系统默认语言与系统支持的语言列表

Delphi mediaplayer循环播放mp3所有音乐文件问题?

Delphi treeview添加背景图片

在xp/2k 下实现 win+ctrl+del 等键的屏蔽的方法

print documents from Delphi - print pdf, doc, xls, html, rtf, docx, txt

Delphi xe5 for android 调用java类库必看的文件

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...