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

Прототип

procedure IncrementSharedCount(const Is64Bit: Boolean; const Filename: String; const AlreadyExisted: Boolean);

Описание

Увеличивает или создаёт счётчик ссылок для указанного файла FileName в следующем разделе реестра:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SharedDLLs

64-разрядные версии Windows имеют два раздельных ключа SharedDLLs: один для 64-разрядных файлов, а другой для 32-разрядных файлов. Если функция Is64Bit вернёт значение True, будет обновлен 64-разрядный ключ SharedDLLs, в противном случае будет обновлен 32-разрядный ключ SharedDLLs. Установка этого параметра должна соответствовать разрядности файла; например, если 32-разрядный файл DLL размещён в 32-разрядном системном каталоге, то необходимо указать значение False. Можно также применить функцию Is64BitInstallMode, тогда для определения нужного раздела реестра будет использован текущий режим установки.

Если файл уже существует, передайте в параметре AlreadyExisted значение True. В этом случае начальный счётчик ссылок для файла будет равен 2, если это значение в реестре для этого файла ещё не существует. (Такое поведение соответствует требованиям Microsoft).

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

Комментарии

Имя файла в параметре Filename должно быть доступно в текущем процессе. Это означает, например, что 32-разрядный установщик, который хочет зарегистрировать DLL в нативном 64-разрядном каталоге {sys}, должен передать путь Sysnative. Используйте функцию ApplyPathRedirRules, как показано в примере ниже, чтобы выполнить эту настройку автоматически. (Вызов ApplyPathRedirRules для DLL, которые находятся вне {sys}, не является обязательным, но в любом случае не повредит.)

Пример

var
  File64Bit, AlreadyExisted: Boolean;
begin
  // Увеличение счётчика TestIncSharedCount.dll, находящегося в каталоге System.

  // Укажите для File64Bit...
  // - False, чтобы обновить 32-разрядный ключ SharedDLLs
  // - True, чтобы обновить 64-разрядный ключ SharedDLLs
  // - Значение Is64BitInstallMode укажет установщику обновить соответствующий ключ
  File64Bit := Is64BitInstallMode;

  // Параметр AlreadyExisted должен иметь True, если файл существовал до установки
  AlreadyExisted := False;

  IncrementSharedCount(File64Bit,
    ApplyPathRedirRules(File64Bit, ExpandConstant('{sys}\TestIncSharedCount.dll'), tpCurrent),
    AlreadyExisted);
end;