自注册
组件软件随市场发展不断发展,用户获取新的软件组件作为单个 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 必须导出函数 DllRegisterServer 和DllUnregisterServer。 任何希望指示服务器注册自身(即其所有 CLSID 和类型库 ID)的应用程序都可以通过 GetProcAddress 函数获取指向 DllRegisterServer 的指针。 在 DllRegisterServer 中,DLL 将创建所有必要的注册表项,为所有 InprocServer32 或 InprocHandler32 项存储 DLL 的正确路径。
当应用程序希望从系统中删除组件时,应通过调用 DllUnregisterServer 取消注册该组件。 在此调用中,服务器将完全删除之前在 DllRegisterServer 中创建的那些项。 服务器不应盲目删除其类的所有项,因为其他软件可能存储了其他项,例如 TreatAs 密钥。
如果服务器打包在 EXE 模块中,则希望注册服务器的应用程序将使用命令行参数 /RegServer 或 -RegServer(不区分大小写)启动 EXE 服务器。 如果应用程序希望取消注册服务器,它将使用命令行参数 /UnregServer 或 -UnregServer 启动 EXE。 自注册 EXE 会检测这些命令行参数,并分别在 DllRegisterServer 和 DllUnregisterServer 中调用与 DLL 相同的操作,在 LocalServer32 下注册其模块路径,而不是 InprocServer32 或 InprocHandler32。
服务器必须为注册表中的相应 InprocServer32、InprocHandler32 和 LocalServer32 密钥注册 DLL 或 EXE 模块安装位置的完整路径。 模块路径可通过 GetModuleFileName 函数轻松获取。
相关主题