Hier weiß ich 100%, woher ich die Funktion habe. Von den JEDIs, und sie funktioniert prima:
Code:
function WinExec32AndWait(const Cmd: string; const CmdShow: Integer): Cardinal;
var
sui : TStartupInfo;
pi : TProcessInformation;
begin
Result := Cardinal($FFFFFFFF);
ZeroMemory(@sui,sizeof(TStartupInfo)); sui.cb := SizeOf(TStartupInfo);
sui.dwFlags := STARTF_USESHOWWINDOW;
sui.wShowWindow := CmdShow;
if(CreateProcess(nil,pchar(Cmd),nil,nil,False,NORMAL_PRIORITY_CLASS,nil,nil,sui,pi)) then
begin
WaitForInputIdle(pi.hProcess, INFINITE);
if(WaitForSingleObject(pi.hProcess, INFINITE) = WAIT_OBJECT_0) then
begin
{$IFDEF DELPHI3}
if not GetExitCodeProcess(pi.hProcess, Integer(Result)) then
{$ELSE}
if not GetExitCodeProcess(pi.hProcess, Result) then
{$ENDIF DELPHI3}
Result := Cardinal($FFFFFFFF);
end;
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
end;
end;
btw: ich verwende diese Funktion auch in meinem Setup, um alte Versionen (Registry) zu entfernen, bevor dann die neue Installation startet. Wie gesagt, klappt sehr gut!
Gruß,
Mathias.