Поделиться через


Self-Registration

Так как программное обеспечение компонентов продолжает расти как рынок, будет больше и больше экземпляров, когда пользователь получает новый программный компонент в виде одного модуля 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.

установка приложения-службы

регистрация класса в установки

регистрация запущенного сервера EXE Server

регистрации объектов в ROT