Что делает 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) заключалась в том, чтобы отделить установку от кода, подобного этому.

Другие вопросы по тегам