共用方式為


元件數據表

[元件] 資料表會列出元件,且其具有下列數據行。

類型 鑰匙
元件 識別碼 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
元件無法從來源執行。 針對屬於功能的所有元件設定此位,以防止功能從網路執行或從來源執行。 請注意,如果功能沒有元件,此功能一律會顯示 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 資料列中的值會當做索引鍵使用至 Registry 資料表中的索引鍵,。 如果登錄數據表中對應記錄的 [值] 欄位為 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
如果已設定此位,如果元件的機碼路徑檔案或金鑰路徑登錄項目已經存在,安裝程式就不會安裝或重新安裝元件。 應用程式會自行註冊為元件的用戶端。
此旗標僅適用於登錄數據表所註冊的元件。 請勿將此旗標用於 AppId類別ExtensionProgIdMIMEVerb 數據表註冊的元件。
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 模擬器 (WOW64) 上執行的 32 位 Windows 應用程式是指與 64 位應用程式不同的登錄檢視。 登錄反映會複製這兩個登錄檢視之間的一些登錄值。
msidbComponentAttributesUninstallOnSupersedence
1024
0x0400
為修補程式套件中的元件設定此位,以防止在計算機上留下孤立元件。 如果已安裝後續的修補程式, 標示 msidbPatchSequenceSupersedeEarlier MsiPatchSequence 數據表中的 值來取代第一個修補程式,Windows Installer 4.5 和更新版本可以取消註冊和卸載標示為 msidbComponentAttributesUninstallOnSupersedence 值的元件。 如果元件未標示此位,則安裝取代修補程式可能會留下計算機上未使用的元件。
設定 MSIUNINSTALLSUPERSEDEDCOMPONENTS 屬性的效果與為所有元件設定此位相同。
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,元件仍會保持啟用。

元件數據表中的 [條件] 資料行會接受條件表達式,其中包含功能和元件已安裝狀態的參考。 如需條件語句語法的詳細資訊,請參閱 條件語句語法

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 的後續呼叫將會失敗。

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

驗證

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