Следующая статья: Все про антивирусы.
Решение
function WinExecAndWait32(name_: String; Visibility: integer): DWORD; var zAppName: array[0..512] of char; zCurDir: array[0..255] of char; WorkDir: String; StartupInfo: TStartupInfo; ProcessInfo: TProcessInformation; Pd: pointer; begin StrPCopy(zAppName, name_); GetDir(0, WorkDir); StrPCopy(zCurDir, WorkDir); FillChar(StartupInfo, Sizeof(StartupInfo), #0); StartupInfo.cb:=Sizeof(StartupInfo); StartupInfo.dwFlags:=STARTF_USESHOWWINDOW; StartupInfo.wShowWindow:=Visibility; if not CreateProcess(nil, zAppName, nil, nil, false, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then Result:=0 else begin WaitforSingleObject(ProcessInfo.hProcess, INFINITE); GetExitCodeProcess(ProcessInfo.hProcess, Result); end; end;
В качестве дополнения внесем резонное исправление – вместо:WaitforSingleObject(ProcessInfo.hProcess, INFINITE); лучше написать:
while WaitforSingleObject(ProcessInfo.hProcess, 200)=WAIT_TIMEOUT do TForm1.Repaint; Смысл замены: в первом варианте главное окно ждёт завершения
вызванного сообщения, не обрабатывая при этом никаких событий. Вследствие этого, главное окно не перерисовывается, что выглядит
далеко не лучшим образом.
Последний вариант исправляет этот
недостаток.