绝对好用,注意绝对路径和当前目录噢
function WinExecAndWait32(FileName: string; Visibility: integer): DWORD;
var
zAppName: PChar;
zCurDir: PChar;
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
begin
zAppName := StrAlloc(Length(FileName) + 1);
StrPCopy(zAppName, FileName);
zCurDir := StrAlloc(Length(ExtractFileDir(ParamStr(0))) + 1);
StrPCopy(zCurDir, ExtractFileDir(ParamStr(0)));
FillChar(StartupInfo, Sizeof(StartupInfo), #0);
StartupInfo.cb := Sizeof(TStartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW {and STARTF_USESTDHANDLES;};
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 }
True {false}, { handle inheritance flag }
CREATE_NEW_CONSOLE or { creation flags }
NORMAL_PRIORITY_CLASS,
nil, { pointer to new environment block }
zCurDir, { pointer to current directory name }
StartupInfo, { pointer to STARTUPINFO }
ProcessInfo) then Result := $FFFFFFFF { pointer to PROCESS_INF }
else
begin
{WaitforSingleObject(ProcessInfo.hProcess, INFINITE);}
CloseHandle(ProcessInfo.hThread);
WaitForInputIdle(ProcessInfo.hProcess, 10000); {let process start!}
repeat
Application.ProcessMessages;
GetExitCodeProcess(ProcessInfo.hProcess, Result);
until (Result <> STILL_ACTIVE) or Application.Terminated;
CloseHandle(ProcessInfo.hProcess);
end;
end;
示例:WinExecAndWait32('net start SQLAgent$MSDE_SMS_ENT', SW_MINIMIZE);