WinExec jest funkcją przestarzałą (obsolete) i Microsoft nie zaleca jej używania (być może w kolejnych wersjach Windows zostanie całkowicie usunięta).
Najwygodniejsze jest chyba zastosowanie ShellExecute (opis w poście powyżej), ale możesz też użyć CreateProcess. Nazwę aplikacji i wszystkie parametry (np.: XXX.exe costam.asm) najlepiej przekazać w drugim argumencie. Wówczas pierwszym argumentem powinno być NIL.
Stosowanie CreateProcess jest nieco męczące, za to oferuje największe możliwości.
Inną funkcją API pozwalającą uruchamiać programy z parametrami jest ShellExecuteEx.
Przykłady:
Procedura uruchamiająca program Exe z parmetrami Params wykorzytująca CreateProcess:
procedure RunProcess(const Exe, Params: string);
var
si: TStartupInfo;
pi: TProcessInformation;
dir: string;
begin
dir := ExtractFileDir(Exe);
if Params <> '' then Exe := Exe + ' ' + Params;
FillCHar(si, SizeOf(si), 0);
FillCHar(pi, SizeOf(pi), 0);
si.cb := SizeOf(si);
if not CreateProcess(
nil, //lpApplicationName
PChar(Exe), //lpCommandLine
nil, //lpProcessAttributes
nil, //lpThreadAttributes
true, //bInheritHandles
0, //dwCreationFlags
nil, //lpEnvironment
PChar(dir), //lpCurrentDirectory
si, //lpStartupInfo
pi //lpProcessInformation
) then
begin
MessageBox(Handle, 'CreateProcess Failed !', 'Error', MB_OK or MB_ICONEXCLAMATION);
Exit;
end;
end;
Procedura uruchamiająca program Exe z parmetrami Params wykorzytująca ShellExecuteEx:
procedure RunProcess2(const Exe, Params: string);
var
dir: string;
sei: TShellExecuteInfo;
begin
dir := ExtractFileDir(Exe);
FillChar(sei, SizeOf(sei), 0);
with sei do
begin
cbSize := SizeOf(sei);
lpFile := PChar(Exe);
lpParameters := PChar(Params);
nShow := SW_SHOW;
fMask := SEE_MASK_NOCLOSEPROCESS;
end;
if not ShellExecuteEx(@sei) then
begin
MessageBox(Handle, 'ShellExecuteEx Failed !', 'Error', MB_OK or MB_ICONEXCLAMATION);
Exit;
end;
end;