Программирование: ExecWithNativeSysDir

Прототип

function ExecWithNativeSysDir(const Filename, Params, WorkingDir: String; const ShowCmd: Integer; const Wait: TExecWait; var ResultCode: Integer): Boolean;

Описание

Используйте эту функцию вместо Exec для запуска исполняемого файла, расположенного в 64-разрядном системном каталоге, из 32-разрядного установщика.

Эта функция позволяет избежать проблемы, связанной с тем, что функция Exec в 32-разрядном установщике может запускать такой исполняемый файл только с помощью псевдонима Sysnative, который недоступен для 64-разрядных приложений. Для этого функция временно отключает перенаправление файловой системы WOW64.

Комментарии

В 32-разрядной Windows или в 64-разрядном установщике эта функция является просто псевдонимом для Exec.

Пример

var
  ResultCode: Integer;
begin
  if IsWin64 then begin
    { Эта команда запустит 32-бит версию cmd.exe в 32-разрядном установщике
      а 64-бит версию cmd.exe в 64-разрядном установщике. }
    Exec(ExpandConstant('{cmd}'), '', '', SW_SHOWNORMAL, ewNoWait, ResultCode);

    { Эта команда запустит 64-бит версию cmd.exe как 32-разрядном установщике,
      так и в 64-разрядном установщике. }
    ExecWithNativeSysDir(ExpandConstant('{cmd}'), '', '', SW_SHOWNORMAL, ewNoWait, ResultCode);
    
    { НЕПРАВИЛЬНО: эта команда также запустила бы 64-бит версию cmd.exe в 32-разрядном установщике,
      но она использовала бы псевдоним Sysnative, по которому 64-бит версия cmd.exe недоступна. } 
    // Exec(ApplyPathRedirRulesForCurrentProcess(True, ExpandConstant('{cmd}')), '', '', SW_SHOWNORMAL, ewNoWait, ResultCode);
end;