实现应用程序中的并行组件共享(二)
当将现有组件修改为并行时,正是将它的激活方式改为使用相对路径和隔离全局状态。重要的是给它一个新的 CLSID、ProgId,并且重命名该文件,然后将这个 CLSID、ProgId 以及新文件名用于后来的并行组件。这样做可以避免在并行版本上再注册该组件的非并行版本而引起的冲突。并行组件和他们以前的非并行版本不向后兼容。 状态存储 对于注册表中存储的状态(设置),需要将状态私有化为该应用程序运行的上下文。可以使用 GetModuleFileName() 函数设置一个虚拟根。应对 HKLM 和 HKCU 分支执行该操作。 必须在每个版本的基础上完成注册设置,以获得注册表的隔离。注册表项是组件保存其状态的通用方法。因为在机器中可能存在组件的不同版本,因此重要的是当重新编译时,能尽可能容易地找到您的表项的版本。获得一套优良的头文件和有用的 API,会使得这件事情变得简单。 用下列命名约定在表项中存储注册状态: HKCU\MyCompany\MyComponent\VersionXXXX\ 例如,假定一个称为 EnableSuperCoolFeature 的配置设置有真或假的值。在注册表中存储该信息的传统方式为: HKEY_CurrentUser\Software\MyCompany\MyComponent\ EnableSuperCoolFeature = TRUE 在并行共享情况下,应当用如下方式存储它: HKEY_CurrentUser\Software\MyCompany\MyComponent\Version01.01 EnableSuperCoolFeature = TRUE 另外,如果确定需要隔离每个应用程序,可以使用 HKCU\MyCompany\MyComponent\VersionXXYY\SomeApplication\\ 其中“SomeApplication”是 GetModuleFileName 的返回值。这样做使组件能够隔离它的设置,该设置只针对当前正在运行的应用程序。 理想的情况下,应支持永久模型,以使应用程序担负起保持用户状态的责任并且不更改注册表。应用程序不必直接与组件的注册表项接触。作为代替,组件应提供一些 API,以保存或恢复与并行一致的设置。 对于全局状态下的交互,存储在除注册表以外的其他位置的设置,应以并行方式存储。这类存储包含: 被保护的存储 (pstore) WinInet 高速缓存 Microsoft SQL Server™ 或 Microsoft Jet 数据库 安装并行组件 安装之前 安装并行组件之前,必须确定在您的操作系统中是否支持它们。下列代码检测并行共享是否可用。如果不可用,组件必须安装在系统目录中。 BOOL bPlatformSupportsSideBySide(void) { OSVERSIONINFOEX osviex ; osviex.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); // 若平台不支持 OSVERSIONINFOEX 结构,就不支持并行 // 在内核中,我们已经使这些修改连在一起 // if (!GetVersionEx((OSVERSIONINFO *)&osviex)) { return FALSE ; // 无 DLL 重定向 } // 然而对于 NT,则 NT4 SP4 支持 OSVERSIONINFOEX 支持,但它不支持 DLL 重定向。 // 若 DLL 重定向出现在将来的 NT4 SP 中,必须更新此代码。 // if ( (osviex.dwPlatformId == VER_PLATFORM_WIN32_NT) && (osviex.dwMajorVersion < 5) ) { return FALSE ; } // 对于其他平台标识,假定具有并行支持 return TRUE ; } 安装与卸载 正确安装和卸载组件很关键。理想情况下,除了将组件复制到应用程序目录中或将其从应用程序目录中删除外,不应有其他的安装和卸装过程。但是,如果需要执行组件的 COM 注册或其他初始设置,则必须以与并行一致的方式执行。 Windows 2000 包含 Windows Installer 版本 1.1,它将支持并行组件的安装和卸载。(在 Windows 2000 发布之后,Windows Installer 还可以联机使用。)当注册并行 COM 组件时,需要确认“类”表中的属性栏设置了 msidbClassAttributesRelativePath 位。这将用相对路径名注册组件,允许相同组件的多个副本共存。 切记,当组件在应用程序目录中是私 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |