http://blog.csdn.net/nerdy/article/details/8969189
- 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: TStartupInfo;
- ProceInfo: TProcessInformation;
- b: Boolean;
- sa: TSecurityAttributes;
- inS: THandleStream;
- sRet: TStrings;
- begin
- Result := '';
- FillChar(sa, sizeof(sa), 0);
- 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);
- StartInfo.hStdOutput := HWrite;
-
- b := CreateProcess(nil,
- PChar(CommandLine),
- nil,
- nil,
- True,
- 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');
|
请发表评论