Самостоятельная регистрация
Так как программное обеспечение компонентов продолжает расти как рынок, будет больше и больше экземпляров, когда пользователь получает новый программный компонент в виде одного модуля DLL или EXE, например при скачивании нового компонента из локальной службы или получения одного из друзей на диске floppy. В таких случаях пользователю не требуется пройти длинную процедуру установки или программу установки. Помимо проблем с лицензированием, которые обрабатываются с помощью IClassFactory2, процедура установки обычно создает необходимые записи реестра для правильного выполнения компонента в контексте COM и OLE.
Самостоятельная регистрация — это стандартное средство, с помощью которого модуль сервера может упаковываться собственные операции реестра, как регистрация, так и отмена регистрации в сам модуль. При использовании с лицензированием, обрабатываемым с помощью IClassFactory2, сервер может стать полностью автономным модулем без необходимости использовать внешние программы установки или файлы .reg.
Любой модуль самостоятельной регистрации, DLL или EXE, сначала должен включать строку OleSelfRegister в раздел StringFileInfo своего ресурса сведений о версии, как показано здесь.
VS_VERSION_INFO VERSIONINFO
...
BEGIN
BLOCK "StringFileInfo"
BEGIN
#ifdef UNICODE
BLOCK "040904B0" // Lang=US English, CharSet=Unicode
#else
BLOCK "040904E4" // Lang=US English, CharSet=Windows Multilingual
#endif
BEGIN
...
VALUE "OLESelfRegister", "\0"
END
...
END
...
END
Существование этих данных позволяет любой стороне, например приложению, которое хочет интегрировать этот новый компонент, чтобы определить, поддерживает ли сервер самостоятельную регистрацию, не загружая библиотеку DLL или EXE.
Если сервер упаковается в модуль DLL, библиотека DLL должна экспортировать функции DllRegisterServer и DllUnregisterServer. Любое приложение, которое хочет указать серверу зарегистрировать себя (то есть все идентификаторы CLSID и библиотеки типов) может получить указатель на DllRegisterServer через функцию GetProcAddress . В dllRegisterServer библиотека DLL создает все необходимые записи реестра, сохраняя правильный путь к библиотеке DLL для всех записей InprocServer32 или InprocHandler32 .
Если приложение хочет удалить компонент из системы, он должен отменить регистрацию этого компонента, вызвав DllUnregisterServer. В рамках этого вызова сервер удаляет именно эти записи, созданные ранее в DllRegisterServer. Сервер не должен слепо удалять все записи для своих классов, так как другое программное обеспечение может хранить дополнительные записи, такие как ключ TreatAs .
Если сервер упаковывается в модуль EXE, приложение, которое хочет зарегистрировать сервер EXE с аргументом командной строки /RegServer или -RegServer (без учета регистра). Если приложение хочет отменить регистрацию сервера, он запускает EXE с аргументом командной строки /UnregServer или -UnregServer. Саморегистрирующийся EXE обнаруживает эти аргументы командной строки и вызывает те же операции, что и библиотека DLL в dllRegisterServerи DllUnregisterServer соответственно, регистрируя путь модуля в LocalServer32 вместо InprocServer32 или InprocHandler32.
Сервер должен зарегистрировать полный путь к расположению установки модуля DLL или EXE для соответствующих ключей InprocServer32, InprocHandler32 и LocalServer32 в реестре. Путь к модулю легко получен с помощью функции GetModuleFileName.
См. также