元件數據表
[元件] 資料表會列出元件,且其具有下列數據行。
列 | 類型 | 鑰匙 | 空 |
---|---|---|---|
元件 | 識別碼 | Y | N |
ComponentId | GUID | N | Y |
目錄_ | 識別碼 | N | N |
屬性 | 整數 | N | N |
條件 | 條件 | N | Y |
KeyPath | 識別碼 | N | Y |
列
-
元件
-
識別元件記錄。
主數據表索引鍵。
-
ComponentId
-
此元件、版本和語言唯一的字串 GUID。
請注意,這些 GUID 的字母必須是大寫。 GUIDGEN 之類的公用程式可以產生包含小寫字母的 GUID。 小寫字母必須變更為大寫,才能讓這些有效的元件程式代碼 GUID。
如果此數據行為 Null,安裝程式不會註冊元件,而且安裝程式無法移除或修復元件。 只有在安裝期間才需要元件,例如清除臨時檔或移除舊產品的自定義動作,可能會刻意完成此動作。 將數據檔複製到不需要註冊的用戶計算機時,也可能很有用。
-
Directory_
-
Directory 資料表中專案的外部索引鍵。 這是屬性名稱,其值包含實際路徑,可由 AppSearch 巨集指令 或從 Directory 數據表取得的預設設定來設定。
開發人員必須避免撰寫將檔案放入其中一個使用者配置檔資料夾的元件。 在多用戶的情況下,這些檔案無法供所有使用者使用,而且可能會導致安裝程式永久檢視元件,因為需要修復。
目錄數據表其中一欄的外部索引鍵。
-
屬性
-
此資料列包含指定遠端執行選項的位旗標。 將指示的位新增至數據行中的總值,以包含選項。
注意
如果是從 Web 位置下載的 .msi 檔案,則不應該將屬性旗標設定為允許從來源執行元件。 這是 Windows Installer 的限制,而且可以傳回INSTALLSTATE_BADCONFIG的功能狀態。
位旗標 - msidbComponentAttributesLocalOnly
- 0
- 0x0000
- msidbComponentAttributesSourceOnly
- 1
- 0x0001
- msidbComponentAttributesOptional
- 2
- 0x0002
- msidbComponentAttributesRegistryKeyPath
- 4
- 0x0004
建議針對寫入 HKCU Hive 的登錄專案設定此位。 這可確保當同一部計算機上有多個使用者時,安裝程式會寫入必要的 HKCU 登錄專案。- msidbComponentAttributesSharedDllRefCount
- 8
- 0x0008
- msidbComponentAttributesPermanent
- 16
- 0x0010
- msidbComponentAttributesODBCDataSource
- 32
- 0x0020
- msidbComponentAttributesTransitive
- 64
- 0x0040
這個位應該只針對可轉移的元件設定。 請參閱使用可轉移元件 。- msidbComponentAttributesNeverOverwrite
- 128
- 0x0080
此旗標僅適用於登錄數據表所註冊的元件。 請勿將此旗標用於 AppId、類別、Extension、ProgId、MIME和 Verb 數據表註冊的元件。- msidbComponentAttributes64bit
- 256
- 0x0100
如果這是取代 32 位元件的 64 位元件,請設定此位,並在 ComponentId 數據行中指派新的 GUID。msidbComponentAttributesDisableRegistryReflection
512
0x0200
將此位設定為停用此元件所影響之所有現有和新登錄機碼上的 登錄反映。 如果設定此位,Windows Installer 會在元件所存取的每個密鑰上呼叫 RegDisableReflectionKey。 此位適用於 Windows Installer 4.0 版。 32 位系統上會忽略此位。 Windows XP 的 64 位版本會忽略此位。
注意: 在 64 位 Windows 模擬器 (WOW64) 上執行的 32 位 Windows 應用程式是指與 64 位應用程式不同的登錄檢視。 登錄反映會複製這兩個登錄檢視之間的一些登錄值。- msidbComponentAttributesUninstallOnSupersedence
- 1024
- 0x0400
設定 MSIUNINSTALLSUPERSEDEDCOMPONENTS 屬性的效果與為所有元件設定此位相同。
Windows Installer 4.0 和更早版本: 不支援 msidbComponentAttributesUninstallOnSupersedence 值,而且會忽略。- msidbComponentAttributesShared
- 2048
- 0x0800
如果 DisableSharedComponent 原則設定為 1,則沒有套件取得此位所啟用的共用元件功能。
Windows Installer 4.0 和更早版本: 不支援 msidbComponentAttributesShared 值,而且會忽略。 -
條件
-
此資料行包含條件語句,可控制元件是否已安裝。 如果條件為 null 或評估為 true,則會啟用元件。 如果條件評估為 False,則元件會停用且未安裝。
[條件] 欄位只會在 CostFinalize 動作期間啟用或停用元件。 若要在 CostFinalize 之後啟用或停用元件,您必須使用自定義動作或 DoAction ControlEvent 呼叫 MsiSetComponentState。
請注意,除非已為元件設定 Attributes 數據行中的可轉移位,否則即使條件數據行中的條件語句稍後在產品的後續維護安裝上評估為 False,元件仍會保持啟用。
元件數據表中的 [條件] 資料行會接受條件表達式,其中包含功能和元件已安裝狀態的參考。 如需條件語句語法的詳細資訊,請參閱 條件語句語法。
-
KeyPath
-
這個值指向屬於安裝程式用來偵測元件之元件的檔案或資料夾。 兩個元件無法共用相同的索引鍵路徑值。 此數據行中的值也是 MsiGetComponentPath 函式所傳回的路徑。
如果值不是 null,則 KeyPath 會是 登錄、ODBCDataSource的主鍵,或根據屬性值 檔案數據表。 如果 KeyPath 為 null,則會使用Directory_數據行的資料夾作為索引鍵路徑。
因為安裝程式所建立的資料夾會在變成空白時刪除,所以您必須將專案撰寫至 createFolder 資料表 ,才能安裝包含空白資料夾的元件。
請注意,如果 Windows Installer 元件包含由 Windows 資源保護 (WRP) 所保護的檔案或登錄機碼,或 Windows 檔案保護所保護的檔案(WFP),則必須使用此資源作為元件的 KeyPath。 在此情況下,Windows Installer 不會安裝、更新或移除元件。 您不應該在安裝套件中包含任何受保護的資源。 相反地,您應該使用 windows 資源保護 支援的資源取代機制。 如需詳細資訊,請參閱 使用 Windows Installer 和 Windows 資源保護。
言論
如需元件與功能之間關聯性的討論,請參閱 功能資料表。
安裝程式會追蹤與登錄中共用 DLL 參考計數無關的共用 DLL。 如果共用 DLL 的參考計數存在於登錄中,安裝程式一律會在安裝檔案時遞增計數,並在卸載時遞減。 如果 msidbComponentAttributesSharedDllRefCount未設定 ,而且參考計數尚未存在,安裝程式將不會建立一個。 請注意,登錄中的 SharedDLLs 參考計數會針對任何安裝到 System 資料夾的檔案遞增。
如果未設定 msidbComponentAttributesSharedDllRefCount,則即使仍然需要,另一個應用程式仍可移除元件。 若要查看這種情況的發生方式,請考慮下列案例:
- 使用安裝程式的應用程式會安裝共用元件。
- msidbComponentAttributesSharedDllRefCount 位未設定,而且沒有參考計數。 因此,安裝程式不會開始參考計數。
- 共用此元件且未使用安裝程式的舊版應用程式已安裝。
- 舊版應用程式會建立及遞增共用元件的參考計數。
- 舊版應用程式已卸載。
- 共用元件的參考計數會遞減為零,並移除元件。
- 使用安裝程式的應用程式不再具有元件的存取權。
若要避免此行為,請設定 msidbComponentAttributesSharedDllRefCount。
請注意,系統服務元件不應指定為從來源執行,而不需要特別設計供這類使用。 如需詳細資訊,請參閱 ServiceInstall 數據表。
請注意,針對包含進入系統資料夾之動態連結庫的元件,不應該設定啟用從來源執行安裝的屬性。 原因是,如果元件安裝狀態在遵循功能或透過在UI中設定,將元件安裝狀態設定為從來源執行,則 DLL 上 LoadLibrary 的後續呼叫將會失敗。
另請參閱 控制特徵選取狀態。