元件資料表

[元件] 資料表會列出元件,並具有下列資料行。

資料行 類型 索引鍵 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
元件無法從來源執行。 針對屬於功能的所有元件設定此位,以防止功能從網路執行或從來源執行。 請注意,如果功能沒有元件,此功能一律會顯示 run-from-source 和 run-from-my-computer 作為有效選項。
msidbComponentAttributesSourceOnly
1
0x0001
元件只能從來源執行。 針對屬於功能的所有元件設定此位,以防止從 my-computer 執行此功能。 請注意,如果功能沒有元件,此功能一律會顯示 run-from-source 和 run-from-my-computer 作為有效選項。
msidbComponentAttributesOptional
2
0x0002
元件可以在本機或來源執行。
msidbComponentAttributesRegistryKeyPath
4
0x0004
如果設定此位,KeyPath 資料行中的值會當做 登錄資料表中的機碼使用。 如果登錄資料表中對應記錄的 Value 欄位為 Null,該記錄中的 [名稱] 欄位不得包含 「+」、「-」 或 「*」。 如需詳細資訊,請參閱 登錄資料表中 [名稱] 欄位的描述。
針對寫入 HKCU Hive 的登錄專案,建議設定此位。 這可確保安裝程式會在同一部電腦上有多個使用者時,寫入必要的 HKCU 登錄專案。
msidbComponentAttributesSharedDllRefCount
8
0x0008
如果設定此位,安裝程式會在元件的金鑰檔案的共用 DLL 登錄中遞增參考計數。 如果未設定此位,安裝程式只會在參考計數已經存在時遞增參考計數。
msidbComponentAttributesPermanent
16
0x0010
如果已設定此位,安裝程式就不會在卸載期間移除元件。 安裝程式會在 Windows Installer 登錄設定中註冊元件的額外系統用戶端。
msidbComponentAttributesODBCDataSource
32
0x0020
如果設定這個位,KeyPath 資料行中的值就是 ODBCDataSource 資料表中的索引鍵。
msidbComponentAttributesTransitive
64
0x0040
如果設定此位,安裝程式會在重新安裝時重新評估 Condition 資料行中的 語句值。 如果值先前為 False 且已變更為 True,安裝程式會安裝元件。 如果值先前為 True 且已變更為 False,則即使元件具有其他產品做為用戶端,安裝程式也會移除元件。
這個位應該只針對可轉移的元件設定。 請參閱 使用可轉移的元件
msidbComponentAttributesNeverOverwrite
128
0x0080
如果已設定此位,如果元件的機碼路徑檔案或金鑰路徑登錄專案已經存在,安裝程式就不會安裝或重新安裝元件。 應用程式會自行註冊為元件的用戶端。
此旗標僅適用于登錄資料表所註冊的元件。 請勿將此旗標用於 由 AppIdClassExtensionProgIdMIMEVerb 資料表註冊的元件。
msidbComponentAttributes64bit
256
0x0100
將此位設定為將此標示為 64 位元件。 此屬性有助於安裝包含 32 位和 64 位元件的套件。 如果未設定此位,元件會註冊為 32 位元件。
如果這是取代 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
為修補程式套件中的元件設定這個位,以防止在電腦上留下孤立元件。 如果已安裝後續的修補程式,請使用 msidbPatchSequenceSupersedeEarlier 值在其 MsiPatchSequence 資料表中標示,以取代第一個修補程式,Windows Installer 4.5 和更新版本可以取消註冊和卸載以 msidbComponentAttributesUninstallOnSupersedence 值標示的元件。 如果元件未標示此位,則取代修補程式的安裝可能會留下電腦上未使用的元件。
設定 MSIUNINSTALLSUPERSEDCOMPONENTS 屬性與為所有元件設定這個位的效果相同。
Windows Installer 4.0 和更早版本 不支援 msidbComponentAttributesUninstallOnSupersedence 值,而且會被忽略。

msidbComponentAttributesShared
2048
0x0800
如果元件在系統上至少安裝一個套件中標示此屬性值,安裝程式會將元件視為所有封裝中標示的。 如果卸載共用標示元件的套件,Windows Installer 4.5 可以繼續共用系統上最高版本的元件,即使卸載的套件已安裝該最高版本也一樣。
如果 DisableSharedComponent 原則設定為 1,則此位未啟用任何套件的共用元件功能。
Windows Installer 4.0 和更早版本 不支援 msidbComponentAttributesShared 值,而且會被忽略。

條件

此資料行包含條件陳述式,可控制元件是否已安裝。 如果條件為 Null 或評估為 true,則會啟用元件。 如果條件評估為 False,則元件會停用且未安裝。

[條件] 欄位只會在 CostFinalize 動作期間啟用或停用元件。 若要在 CostFinalize 之後啟用或停用元件,您必須使用自訂動作或 DoAction ControlEvent 來呼叫 MsiSetComponentState

請注意,除非已為元件設定 Attributes 資料行中的可轉移位,否則即使條件資料行中的條件陳述式稍後在產品的後續維護安裝上評估為 False,元件仍會保持啟用狀態。

Component 資料表中的 [條件] 資料行接受條件運算式,其中包含功能與元件已安裝狀態的參考。 如需條件陳述式語法的詳細資訊,請參閱 條件陳述式語法

KeyPath

這個值指向屬於安裝程式用來偵測元件之元件的檔案或資料夾。 兩個元件無法共用相同的索引鍵路徑值。 此資料行中的值也是 MsiGetComponentPath 函式所傳回的路徑。

如果此值不是 Null,則 KeyPath 是 登錄ODBCDataSourceFile 資料表 的主鍵,視屬性值而定。 如果 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 將會失敗。

另請參閱 控制特徵選取狀態

驗證

ICE02
ICE03
ICE06
ICE07
ICE08
ICE09
ICE18
ICE19
ICE21
ICE30
ICE32
ICE35
ICE38
ICE41
ICE42
ICE43
ICE46
ICE50
ICE54
ICE57
ICE59
ICE62
ICE67
ICE76
ICE79
ICE80
ICE83
ICE86
ICE88
ICE91
ICE92
ICE97