Что делает regsvr32?
Чтобы зарегистрировать файл DLL на сервере Windows, используя regsvr32
Вам сначала нужно переместить файл в свой system32
папка или это на самом деле происходит автоматически после вызова regsvr32
команда?
Если я просто уроню dll-файл на свой рабочий стол и зарегистрирую его там, могу ли я просто удалить его после регистрации? Что будет после его удаления?
Другими словами, как на самом деле работает regsvr?
2 ответа
В дополнение к правильному ответу @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
Это правильный путь к файлу, когда regsvr32.exe использовался для регистрации этого COM-объекта. Если вы переместите файл вручную, объект COM больше не будет работать, поскольку это значение реестра теперь ссылается на отсутствующий файл.
Поэтому, прежде чем использовать regsvr32.exe в DLL, переместите его в окончательное расположение и не перемещайте DLL после регистрации.
RegSvr32 вызывает экспортированный метод DllRegisterServer в DLL. Что конкретно происходит дальше, зависит от реализации. Часто ключи реестра для COM пишутся на основе расположения файла. Как правило, регистрацию не следует считать установщиком, который делает гораздо больше.
Если в приложении нет чего-то определенного, его можно зарегистрировать из любого места, но после этого не следует перемещать / удалять его. SysMternal SysMon может наблюдать за доступом к файлам и реестру, когда вы вызываете регистрацию, если вы действительно хотите увидеть детали - хотя ничто не мешает коду ничего не делать или что-то действительно код может сделать, например, доступ в Интернет, запись или удаление других файлов и так далее, Как и любой исполняемый файл, регистрируйте только тот код, которому доверяете.
Существует также DllInstall, который можно вызвать сregsvr32 /i
который предназначен для установки в соответствии с документацией regsvr32:
Regsvr32
Этот инструмент командной строки регистрирует файлы DLL в качестве компонентов команд в реестре.
Синтаксис
regsvr32 [/u] [/s] [/n] [/i[:cmdline]] dllname
параметры
/ u: Отмена регистрации сервера.
/ s: указывает, что regsvr32 запускается без вывода сообщений и не отображает никаких сообщений.
/ n: Указывает не вызывать DllRegisterServer. Вы должны использовать эту опцию с / i.
/ i: cmdline: вызывает DllInstall, передавая его необязательно [cmdline]. При использовании с / u вызывает dll uninstall.
имя dll: указывает имя файла dll, который будет зарегистрирован.
/?: Отображение справки в командной строке.
Существует также DllUnregisterServer, но из практического опыта реализации этого, как правило, более низкого качества, чем регистрация.
Одна из целей установщика Windows (MSI) заключалась в том, чтобы отделить установку от кода, подобного этому.