本文整理自网络,侵删。
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 fdconnection1获取查询语句的第一个值
Delphi xe android 调试错误:connection closed gracefully
Delphi xe7 判断android应用程序中的通信状态类型
更多相关阅读请进入《Delphi》频道 >>