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

Прототип

function ApplyPathRedirRules(const Path64Bit: Boolean; const Path: String; const TargetProcess: TPathRedirTargetProcess): String;

Описание

Применяет перенаправление системного пути к указанному пути и возвращает перезаписанный путь.

Параметр Path64Bit определяет текущую разрядность пути Path: True — 64-бит, а False — 32-бит. Параметр TargetProcess определяет разрядность процесса, который в конечном итоге будет обращаться к преобразованному пути. В таблице раздела справки "Перенаправление системного пути" это, соответственно, "разрядность записи" и "разрядность целевого процесса".

Перед перезаписью путь раскрывается с помощью функции ExpandFileName и преобразуется в удлиненный путь (также известный как "суперпуть").

Раскрытие пути и преобразование в удлиненный путь выполняются всегда, даже если ничего не перезаписывается.

Комментарии

На системах под управлением Windows 32-бит параметр Path64Bit должен быть равен False, в противном случае будет сгенерировано исключение.

Класс TPathRedirTargetProcess — это перечисляемый тип и объявлен следующим образом:

TPathRedirTargetProcess = (tpCurrent, tpNativeBit, tp32Bit, tp32BitPreferSystem32);
Значение Разрядность целевого процесса
tpCurrent 64-бит в 64-разрядном установщике, или 32-бит в 32-разрядном установщике
tpNativeBit 64-бит при запуске на Windows 64-бит или 32-бит на Windows 32-бит
tp32Bit 32-бит
tp32BitPreferSystem32 32-бит, в преобразованном пути используется System32 вместо SysWOW64 (см. главу "Перенаправление системного пути")

Пример:

var
  InPath, OutPath: String;
begin
  InPath := ExpandConstant('{sys}\MyLibrary.dll');
  Log(InPath);
  // Обычно записывается путь: C:\Windows\System32\MyLibrary.dll

  // Преобразование 64-разрядного пути в путь, доступный в текущем процессе
  if IsWin64 then
  begin
    OutPath := ApplyPathRedirRules(True, InPath, tpCurrent);
    Log(OutPath);
    // В 32-разрядном установщике записывается путь: \\?\C:\Windows\Sysnative\MyLibrary.dll
    // В 64-разрядном установщике записывается путь: \\?\C:\Windows\System32\MyLibrary.dll
  end;

  // Преобразование 32-разрядного пути в путь, доступный в текущем процессе
  OutPath := ApplyPathRedirRules(False, InPath, tpCurrent);
  Log(OutPath);
  // В 32-разрядном установщике записывается путь: \\?\C:\Windows\SysWOW64\MyLibrary.dll
  // В 64-разрядном установщике записывается путь: \\?\C:\Windows\SysWOW64\MyLibrary.dll
end

См. также:

ApplyPathRedirRulesForCurrentProcess
PathConvertSuperToNormal