1. 程式人生 > >Delphi下呼叫CMD命令並獲取結果

Delphi下呼叫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: TStartupInfo; 
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 := CreateProcess(nil, //lpApplicationName: PChar 
PChar(CommandLine), //lpCommandLine: PChar 
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;