У меня следующая функция работает. Путь к файлу нужно передавать полный (пропустив через SysUtils.ExpandFileName).
FUNCTION RunProcess (CONST ExeFilePath, ExeArgs, ExeCurrentDir: STRING; WaitEnd: BOOLEAN): BOOLEAN;
CONST
DEFAULT_PROCESS_ATTRIBUTES = NIL;
DEFAULT_THREAD_ATTRIBUTES = NIL;
INHERIT_HANDLES = TRUE;
NO_CREATION_FLAGS = 0;
INHERIT_ENVIROMENT = NIL;
VAR
StartupInfo: Windows.TStartupInfo;
ProcessInfo: Windows.TProcessInformation;
BEGIN
FillChar(StartupInfo, SIZEOF(StartupInfo), #0);
StartupInfo.cb := SIZEOF(StartupInfo);
RESULT := Windows.CreateProcess
(
NIL,
PCHAR('"' + ExeFilePath + '" ' + ExeArgs),
DEFAULT_PROCESS_ATTRIBUTES,
DEFAULT_THREAD_ATTRIBUTES,
NOT INHERIT_HANDLES,
NO_CREATION_FLAGS,
INHERIT_ENVIROMENT,
POINTER(ExeCurrentDir),
StartupInfo,
ProcessInfo
);
IF RESULT THEN BEGIN
IF WaitEnd THEN BEGIN
Windows.WaitForSingleObject(ProcessInfo.hProcess, Windows.INFINITE);
END; // .IF
END; // .IF
END; // .FUNCTION RunProcess