当将现有组件修改为并行时,正是将它的激活方式改为使用相对路径和隔离全局状态。重要的是给它一个新的 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 ;
}