Чтобы зарегистрировать файл DLL на сервере Windows с помощью regsvr32
, вам сначала нужно переместить файл на свой system32
папку или это на самом деле выполняется автоматически после вызова regsvr32
команда?
Если я просто закину на рабочий стол файл dll и зарегистрирую его там, могу ли я просто удалить его после регистрации? Что будет после его удаления?
Другими словами, как на самом деле работает regsvr?
RegSvr32 вызывает экспортированный метод DllRegisterServer в DLL. Что конкретно произойдет дальше, зависит от реализации. Часто ключи реестра для COM записываются в зависимости от расположения файла. Регистрацию, как правило, не следует рассматривать как программу установки, которая делает гораздо больше.
Если в приложении нет чего-то особенного, его можно зарегистрировать откуда угодно, но после этого не следует перемещать / удалять его. SysMon от SysInternal Вы можете наблюдать за доступом к файлам и реестру, когда вы вызываете регистрацию, если вы действительно хотите увидеть подробности - хотя ничто не мешает коду ничего не делать или действительно что-то, что код может делать, например, доступ в Интернет, запись или удаление других файлов и т. Как и любой исполняемый файл, зарегистрируйте только тот код, которому вы доверяете.
А также есть DllInstall что можно назвать с regsvr32 /i
который предназначен для установки в соответствии с regsvr32 документация:
Regsvr32
Этот инструмент командной строки регистрирует файлы .dll как компоненты команд в реестре.
Синтаксис
regsvr32 [/ u] [/ s] [/ n] [/ i [: cmdline]] имя библиотеки
Параметры
/ u : Отменяет регистрацию сервера.
/ с : Указывает, что regsvr32 будет работать в автоматическом режиме и не отображать окна сообщений.
/ п : Указывает не вызывать DllRegisterServer. Вы должны использовать этот параметр с / i.
/ i: cmdline : Вызывает DllInstall, передав ему необязательную [cmdline]. При использовании с / u вызывает удаление dll.
dllname : Указывает имя файла DLL, который будет зарегистрирован.
/? : Отображает справку в командной строке.
А также есть DllUnregisterServer, но из практического опыта реализация этого обычно бывает более низкого качества, чем регистрация.
Одна из целей установщика Windows (MSI) состояла в том, чтобы отделить установку от такого кода.
В дополнение к правильному ответу @Matthew Wetmore обычно происходит то, что он регистрирует все компоненты COM в этой dll.
В частности, он создает два ключа (+ подразделы) в реестре Windows.
Например. рассмотрим dll: dao360.dll
, в котором есть несколько COM-объектов. Для каждого первого ключа это что-то вроде:
HKLM \ SOFTWARE \ Classes \ DAO.TableDef.36
для объекта определения таблицы DAO имя ключа - это ProgID COM-объекта, на который программисты будут ссылаться в своем коде.
Под ключом обычно находится один ключ со значением по умолчанию:
HKLM \ SOFTWARE \ Classes \ DAO.TableDef.36 \ CLSID
в таком случае:
{00000103-0000-0010-8000-00AA006D2EA4}
это идентификатор класса или CLSID для COM-объекта, он сообщает нам, где находится второй ключ:
HKLM \ SOFTWARE \ Classes \ CLSID {00000103-0000-0010-8000-00AA006D2EA4}
Этот ключ с его подразделами и значениями содержит дополнительную информацию о COM-объекте.
Следует обратить внимание на значение по умолчанию:
HKLM \ SOFTWARE \ Classes \ Wow6432Node \ CLSID {00000103-0000-0010-8000-00AA006D2EA4} \ InprocServer32
в нем указан путь к файлу exe / dll, в котором находится COM-объект, в нашем примере:
%CommonProgramFiles%\Microsoft Shared\DAO\dao360.dll
Это правильный путь к файлу, когда для регистрации этого COM-объекта использовался regsvr32.exe. Если вы переместите файл вручную, COM-объект перестанет работать, поскольку это значение реестра теперь ссылается на отсутствующий файл.
Поэтому, прежде чем использовать regsvr32.exe в DLL, переместите его в окончательное расположение и не перемещайте DLL после ее регистрации.