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

来源:互联网 发布:巫师3年度版ps4pro优化 编辑:程序博客网 时间:2024/04/29 18:59

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 



0 0
原创粉丝点击