当将现有组件修改为并行时,正是将它的激活方式改为使用相对路径和隔离全局状态。重要的是给它一个新的 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 的返回值。这样做使组件能够隔离它的设置,该设置只针对当前正在运行的应用程序。