Итак, я пришел к такому обработчику кнопки "Установить":
Код:
procedure TForm1.btn_instClick(Sender: TObject);
var
ini: TMemIniFile;
sl: TStrings;
i: Integer;
Ident, Value: String;
SI: TStartupInfo;
PI: TProcessInformation;
begin
ini := TMemIniFile.Create('install.ini');
FillChar(SI, SizeOf(SI), 0);
SI.cb := SizeOf(SI);
SI.wShowWindow := SW_NORMAL;
SI.dwFlags := STARTF_USESHOWWINDOW;
try
sl := TStringList.Create;
try
ini.ReadSection('soft', sl);
for i := 0 to sl.Count - 1 do
begin
Ident := sl[i];
Value := ini.ReadString('soft', Ident, '');
if CreateProcess(PChar(Ident), PChar(' ' + Value), nil, nil, False, 0, nil, nil, SI, PI) then
try
while True do
begin
if (WaitForSingleObject(PI.hProcess, 100) <> WAIT_TIMEOUT) then Break;
end;
finally
CloseHandle(PI.hProcess);
CloseHandle(PI.hThread);
end;
end;
finally
sl.Free;
end;
finally
ini.Free;
end;
end;
В целом программа работает исправно: читает ini и запускает по порядку дистрибутивы программ с параметрами.
Но снова столкнулся с проблемой. Гуглил пол дня, копался в примерах и исходниках, но так и не понял, как вывести это все в отдельный поток. Также, я не смог найти никакой документации к компоненту BMDThread. Поскольку приложение будет выполнять у меня по несколько функций сразу, жизненно необходимо, чтобы основная форма была доступна во время инсталляции сторонних программ.