元件資料表
[元件] 資料表會列出元件,並具有下列資料行。
資料行 | 類型 | 索引鍵 | Nullable |
---|---|---|---|
元件 | 識別碼 | 是 | 否 |
ComponentId | GUID | 否 | 是 |
目錄_ | 識別碼 | N | N |
屬性 | 整數 | N | N |
條件 | Condition | 否 | 是 |
KeyPath | 識別碼 | 否 | 是 |
資料行
-
元件
-
識別元件記錄。
主資料表索引鍵。
-
ComponentId
-
此元件、版本和語言唯一的字串 GUID。
請注意,這些 GUID 的字母必須是大寫。 GUIDGEN 之類的公用程式可以產生包含小寫字母的 GUID。 小寫字母必須變更為大寫,才能讓這些有效的元件程式碼 GUID。
如果此資料行為 Null,安裝程式就不會註冊元件,而且安裝程式無法移除或修復元件。 只有在安裝期間才需要元件,例如清除暫存檔或移除舊產品的自訂動作,可能會刻意完成此動作。 將資料檔案複製到不需要註冊的使用者電腦時,也可能很有用。
-
目錄_
-
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、 Class、 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 模擬器上執行的 32 位 Windows 應用程式 (WOW64) 參考登錄與 64 位應用程式不同的檢視。 登錄反映會在這兩個登錄檢視之間複製一些登錄值。- msidbComponentAttributesUninstallOnSupersedence
- 1024
- 0x0400
設定 MSIUNINSTALLSUPERSEDCOMPONENTS 屬性與為所有元件設定這個位的效果相同。
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,元件仍會保持啟用狀態。
Component 資料表中的 [條件] 資料行接受條件運算式,其中包含功能與元件已安裝狀態的參考。 如需條件陳述式語法的詳細資訊,請參閱 條件陳述式語法。
-
KeyPath
-
這個值指向屬於安裝程式用來偵測元件之元件的檔案或資料夾。 兩個元件無法共用相同的索引鍵路徑值。 此資料行中的值也是 MsiGetComponentPath 函式所傳回的路徑。
如果此值不是 Null,則 KeyPath 是 登錄、 ODBCDataSource或 File 資料表 的主鍵,視屬性值而定。 如果 KeyPath 為 null,則會使用Directory_資料行的資料夾做為索引鍵路徑。
因為安裝程式建立的資料夾會在變成空白時刪除,所以您必須在 CreateFolder 資料表 中撰寫專案,才能安裝包含空白資料夾的元件。
請注意,如果 Windows Installer 元件包含 受 Windows Resource Protection 保護的檔案或登錄機碼, (WRP) 或受 WINDOWS 檔案保護的檔案 () ,則必須使用此資源作為元件的 KeyPath。 在此情況下,Windows Installer 不會安裝、更新或移除元件。 您不應該在安裝套件中包含任何受保護的資源。 相反地,您應該使用 Windows Resource Protection 支援的資源取代機制 。 如需詳細資訊,請參閱 使用 Windows Installer 和 Windows 資源保護。
備註
如需元件與功能之間關聯性的討論,請參閱 功能表。
安裝程式會追蹤與登錄中共用 DLL 參考計數無關的共用 DLL。 如果共用 DLL 的參考計數存在於登錄中,安裝程式一律會在安裝檔案時遞增計數,並在卸載時遞減。 如果未設定 msidbComponentAttributesSharedDllRefCount,而且參考計數尚未存在,安裝程式將不會建立一個。 請注意,登錄中的 SharedDLLs 參考計數會針對安裝至 System 資料夾的任何檔案遞增。
如果未設定 msidbComponentAttributesSharedDllRefCount ,則即使仍需要,另一個應用程式仍可移除元件。 若要查看這種情況的發生方式,請考慮下列案例:
- 使用安裝程式的應用程式會安裝共用元件。
- msidbComponentAttributesSharedDllRefCount位未設定,而且沒有參考計數。 因此,安裝程式不會開始參考計數。
- 共用此元件的繼承應用程式,不會安裝安裝程式。
- 繼承應用程式會建立並遞增共用元件的參考計數。
- 繼承應用程式已卸載。
- 共用元件的參考計數會遞減為零,並移除元件。
- 使用安裝程式的應用程式不再具有元件的存取權。
若要避免此行為,請設定 msidbComponentAttributesSharedDllRefCount。
請注意,系統服務元件不應該指定為從來源執行,而不需特別設計供這類使用。 如需詳細資訊,請參閱 ServiceInstall 資料表 。
請注意,針對包含進入系統資料夾之動態連結程式庫的元件,不應該設定啟用從來源執行安裝的屬性。 原因是,如果元件的安裝狀態設定為從來源執行,方法是遵循功能或在 UI 中設定,後續呼叫 DLL 上的 LoadLibrary 將會失敗。
另請參閱 控制特徵選取狀態。