自注册

组件软件随市场发展不断发展,用户获取新的软件组件作为单个 DLL 或 EXE 模块的实例将越来越多,例如从联机服务下载新组件或从好友的软盘上接收新组件时。 在这些情况下,要求用户完成漫长的安装过程或安装程序并不可行。 除了通过 IClassFactory2 处理的许可问题之外,安装过程通常会创建组件在 COM 和 OLE 上下文中正常运行所需的注册表项。

自注册是一种标准手段,服务器模块可以通过该方式将自己的注册表操作(注册和取消注册)打包到模块本身中。 与通过 IClassFactory2 处理的许可一起使用时,服务器可以成为完全独立的模块,无需外部安装程序或 .reg文件。

任何自注册模块(DLL 或 EXE)都应首先在其版本信息资源的 StringFileInfo 部分中包含“OleSelfRegister”字符串,如下所示。

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 必须导出函数 DllRegisterServerDllUnregisterServer。 任何希望指示服务器注册自身(即其所有 CLSID 和类型库 ID)的应用程序都可以通过 GetProcAddress 函数获取指向 DllRegisterServer 的指针。 在 DllRegisterServer 中,DLL 将创建所有必要的注册表项,为所有 InprocServer32InprocHandler32 项存储 DLL 的正确路径。

当应用程序希望从系统中删除组件时,应通过调用 DllUnregisterServer 取消注册该组件。 在此调用中,服务器将完全删除之前在 DllRegisterServer 中创建的那些项。 服务器不应盲目删除其类的所有项,因为其他软件可能存储了其他项,例如 TreatAs 密钥。

如果服务器打包在 EXE 模块中,则希望注册服务器的应用程序将使用命令行参数 /RegServer-RegServer(不区分大小写)启动 EXE 服务器。 如果应用程序希望取消注册服务器,它将使用命令行参数 /UnregServer-UnregServer 启动 EXE。 自注册 EXE 会检测这些命令行参数,并分别在 DllRegisterServerDllUnregisterServer 中调用与 DLL 相同的操作,在 LocalServer32 下注册其模块路径,而不是 InprocServer32InprocHandler32

服务器必须为注册表中的相应 InprocServer32InprocHandler32LocalServer32 密钥注册 DLL 或 EXE 模块安装位置的完整路径。 模块路径可通过 GetModuleFileName 函数轻松获取。

安装即服务应用程序

安装时注册类

注册正在运行的 EXE 服务器

在 ROT 中注册对象