當將現有組件修改為並行時,正是將它的啟用方式改為使用相對路徑和隔離全域狀態。重要的是給它一個新的 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 ;
}