分类:
2009-11-26 01:12:50
function WinExecute(FileName:string;Visibility:Integer=SW_NORMAL):Boolean;
{*运行一个文件并立即返回}
function WinExecAndWait32(FileName:string;Visibility:Integer=SW_NORMAL;ProcessMsg:Boolean=False):Integer;
Function WinExecExW(CMD,WorkDir:Pchar;Visiable:integer):DWORD;
{*运行一个文件并等待其结束}
function WinExecWithPipe(const CmdLine,Dir:string;slOutput:TStrings;var dwExitCode:Cardinal):Boolean;overload;
function WinExecWithPipe(const CmdLine,Dir:string;var Output:string;var dwExitCode:Cardinal):Boolean;overload;
{*用管道方式在Dir目录执行CmdLine,Output返回输出信息,dwExitCode返回退出码。如果成功返回True }
---
// 运行一个文件并立即返回
function WinExecute(FileName:string;Visibility:Integer=SW_NORMAL):Boolean;
var
StartupInfo:TStartupInfo;
ProcessInfo:TProcessInformation;
begin
FillChar(StartupInfo,SizeOf(StartupInfo),#0);
StartupInfo.cb:=SizeOf(StartupInfo);
StartupInfo.dwFlags:=STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow:=Visibility;
Result:=CreateProcess(nil,PChar(FileName),nil,nil,False,CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,nil,nil,StartupInfo,ProcessInfo);
end;
// 运行一个文件并等待其结束
function WinExecAndWait32(FileName:string;Visibility:Integer;ProcessMsg:Boolean):Integer;
var
zAppName:array[0..512] of Char;
zCurDir: array[0..255] of Char;
WorkDir: string;
StartupInfo:TStartupInfo;
ProcessInfo:TProcessInformation;
begin
StrPCopy(zAppName,FileName);
GetDir(0,WorkDir);
StrPCopy(zCurDir,WorkDir);
FillChar(StartupInfo,SizeOf(StartupInfo),#0);
StartupInfo.cb:=SizeOf(StartupInfo);
StartupInfo.dwFlags:=STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow:=Visibility;
if not CreateProcess(nil,
zAppName, { pointer to command line string }
nil, { pointer to process security attributes }
nil, { pointer to thread security attributes }
False, { handle inheritance flag }
CREATE_NEW_CONSOLE or { creation flags }
NORMAL_PRIORITY_CLASS,
nil, { pointer to new environment block }
nil, { pointer to current directory name }
StartupInfo, { pointer to STARTUPINFO }
ProcessInfo) then
Result := -1 { pointer to PROCESS_INF }
else
begin
if ProcessMsg then
begin
repeat
Application.ProcessMessages;
GetExitCodeProcess(ProcessInfo.hProcess, Cardinal(Result));
until (Result <> STILL_ACTIVE) or Application.Terminated;
end
else
begin
WaitforSingleObject(ProcessInfo.hProcess, INFINITE);
GetExitCodeProcess(ProcessInfo.hProcess, Cardinal(Result));
end;
end;
end;
Function WinExecExW(CMD,WorkDir:Pchar;Visiable:integer):DWORD;
var
StartupInfo:TStartupInfo;
ProcessInfo:TProcessInformation;
begin
FillChar(StartupInfo,SizeOf(StartupInfo),#0);
StartupInfo.cb:=SizeOf(StartupInfo);
StartupInfo.dwFlags:=STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow:=Visiable;
if not CreateProcess(nil,
cmd,
nil,
nil,
false,
Create_new_console or Normal_priority_class,
nil,
WorkDir,
StartupInfo,
ProcessInfo) then
result:=0
else
begin
WaitForSingleObject(Processinfo.hProcess,INFINITE);
GetExitCodeProcess(ProcessInfo.hProcess,Result);
end;
end;
//上面的函数会一直等到执行完再退出
使用:WinExecExW('CMD.exe /c c:\myapp\a.cmd','c:\',SW_Hide);
// 用管道方式在Dir目录执行CmdLine,Output返回输出信息,
// dwExitCode 返回退出码。如果成功返回 True
function WinExecWithPipe(const CmdLine,Dir:string;slOutput:TStrings;var dwExitCode:Cardinal):Boolean;
var
HOutRead, HOutWrite: THandle;
StartInfo: TStartupInfo;
ProceInfo: TProcessInformation;
sa: TSecurityAttributes;
InStream: THandleStream;
strTemp: string;
PDir: PChar;
procedure ReadLinesFromPipe(IsEnd: Boolean);
var
s: string;
ls:TStringList;
i: Integer;
begin
if InStream.Position
SetLength(s,InStream.Size - InStream.Position);
InStream.Read(PChar(s)^, InStream.Size - InStream.Position);
strTemp:=strTemp+s;
ls:=TStringList.Create;
try
ls.Text:=strTemp;
for i:=0 to ls.Count-2 do
slOutput.Add(ls[i]);
strTemp:=ls[ls.Count-1];
finally
ls.Free;
end;
end;
if IsEnd and (strTemp<>'') then
begin
slOutput.Add(strTemp);
strTemp:='';
end;
end;
begin
dwExitCode:=0;
Result:=False;
try
FillChar(sa,sizeof(sa),0);
sa.nLength:=sizeof(sa);
sa.bInheritHandle:=True;
sa.lpSecurityDescriptor:=nil;
InStream:=nil;
strTemp:='';
HOutRead:=INVALID_HANDLE_VALUE;
HOutWrite:=INVALID_HANDLE_VALUE;
try
Win32Check(CreatePipe(HOutRead,HOutWrite,@sa,0));
FillChar(StartInfo,SizeOf(StartInfo),0);
StartInfo.cb:=SizeOf(StartInfo);
StartInfo.wShowWindow:=SW_HIDE;
StartInfo.dwFlags:=STARTF_USESTDHANDLES+STARTF_USESHOWWINDOW;
StartInfo.hStdError:=HOutWrite;
StartInfo.hStdInput:=GetStdHandle(STD_INPUT_HANDLE);
StartInfo.hStdOutput:=HOutWrite;
InStream:=THandleStream.Create(HOutRead);
if Dir<>'' then
PDir:=PChar(Dir)
else
PDir:=nil;
Win32Check(CreateProcess(nil, //lpApplicationName: PChar
PChar(CmdLine), //lpCommandLine: PChar
nil, //lpProcessAttributes: PSecurityAttributes
nil, //lpThreadAttributes: PSecurityAttributes
True, //bInheritHandles: BOOL
NORMAL_PRIORITY_CLASS, //CREATE_NEW_CONSOLE,
nil,
PDir,
StartInfo,
ProceInfo));
while WaitForSingleObject(ProceInfo.hProcess,100)=WAIT_TIMEOUT do
begin
ReadLinesFromPipe(False);
Application.ProcessMessages;
//if Application.Terminated then break;
end;
ReadLinesFromPipe(True);
GetExitCodeProcess(ProceInfo.hProcess, dwExitCode);
CloseHandle(ProceInfo.hProcess);
CloseHandle(ProceInfo.hThread);
Result := True;
finally
if InStream<>nil then InStream.Free;
if HOutRead<>INVALID_HANDLE_VALUE then CloseHandle(HOutRead);
if HOutWrite<>INVALID_HANDLE_VALUE then CloseHandle(HOutWrite);
end;
except
;
end;
end;
function WinExecWithPipe(const CmdLine,Dir:string;var Output:string;var dwExitCode:Cardinal):Boolean;
var
slOutput:TStringList;
begin
slOutput:=TStringList.Create;
try
Result:=WinExecWithPipe(CmdLine,Dir,slOutput,dwExitCode);
Output:=slOutput.Text;
finally
slOutput.Free;
end;
end;