Component テーブル
Component テーブルにはコンポーネントの一覧が格納され、次の列があります。
Column | 種類 | キー | Nullable |
---|---|---|---|
コンポーネント | Identifier | Y | N |
ComponentId | GUID | N | Y |
Directory_ | Identifier | N | N |
属性 | 整数 | N | N |
条件 | Condition | N | Y |
KeyPath | Identifier | N | Y |
[列]
-
Component
-
コンポーネント レコードを特定します。
主テーブル キー。
-
ComponentId
-
このコンポーネント、バージョン、言語に固有の文字列 GUID。
これらの GUID の文字は大文字にする必要があることに注意してください。 GUIDGEN などのユーティリティを使って、小文字を含む GUID を生成できます。 これらを有効なコンポーネント コード GUID にするには、小文字を大文字に変更する必要があります。
この列が null の場合、インストーラーでコンポーネントは登録されません。また、インストーラーを使ってコンポーネントを削除または修復することはできません。 これは、インストール時にコンポーネントが必要な場合にのみ意図的に行うことができます。たとえば、一時ファイルをクリーンしたり、古い製品を削除したりするカスタム アクションなどです。 また、登録する必要がないデータ ファイルをユーザーのコンピューターにコピーする場合にも便利です。
-
Directory_
-
Directory テーブルのエントリの外部キー。 これはプロパティ名であり、その値には実際のパスが含まれています。AppSearch アクションで設定するか、Directory テーブルから取得した既定の設定を使うことができます。
開発者は、ユーザー プロファイル フォルダーのいずれかにファイルを配置するコンポーネントを作成しないようにする必要があります。 このようなファイルは、マルチユーザーの状況ではすべてのユーザーが使用できません。また、インストーラーで修復が必要なコンポーネントであると永続的に表示される可能性があります。
Directory テーブルの列 1 の外部キー。
-
Attributes
-
この列には、リモート実行のオプションを指定するビット フラグが含まれています。 オプションを含めるには、指定されたビットをこの列の合計値に追加します。
Note
Web の場所からダウンロードされる .msi ファイルの場合、コンポーネントをソースから実行できるように属性フラグを設定しないでください。 これは Windows インストーラーの制限であり、INSTALLSTATE_BADCONFIG という機能状態を返すことがあります。
ビット フラグ - msidbComponentAttributesLocalOnly
- 0
- 0x0000
- msidbComponentAttributesSourceOnly
- 1
- 0x0001
- msidbComponentAttributesOptional
- 2
- 0x0002
- msidbComponentAttributesRegistryKeyPath
- 4
- 0x0004
HKCU ハイブに書き込まれるレジストリ エントリには、このビットを設定することをお勧めします。 これにより、同じマシンに複数のユーザーがいる場合に、必要な HKCU レジストリ エントリがインストーラーによって確実に書き込まれます。- msidbComponentAttributesSharedDllRefCount
- 8
- 0x0008
- msidbComponentAttributesPermanent
- 16
- 0x0010
- msidbComponentAttributesODBCDataSource
- 32
- 0x0020
- msidbComponentAttributesTransitive
- 64
- 0x0040
このビットは、推移的コンポーネントにのみ設定するようにしてください。 「推移的コンポーネントの使用」を参照してください。- msidbComponentAttributesNeverOverwrite
- 128
- 0x0080
このフラグは、Registry テーブルによって登録されているコンポーネントにのみ使ってください。 AppId、Class、Extension、ProgId、MIME、Verb テーブルによって登録されたコンポーネントには、このフラグを使わないでください。- msidbComponentAttributes64bit
- 256
- 0x0100
これが 32 ビット コンポーネントを置き換える 64 ビット コンポーネントである場合は、このビットを設定し、ComponentId 列に新しい GUID を割り当ててください。msidbComponentAttributesDisableRegistryReflection
512
0x0200
このビットを設定すると、このコンポーネントの影響を受けるすべての既存と新規のレジストリ キーでレジストリのリフレクションが無効になります。 このビットを設定した場合、コンポーネントからアクセスされるキーごとに、Windows インストーラーによって RegDisableReflectionKey が呼び出されます。 このビットは Windows インストーラー バージョン 4.0 で使用できます。 このビットは 32 ビット システムでは無視されます。 このビットは、Windows XP の 64 ビット バージョンでは無視されます。
注: 64 ビット Windows エミュレーター (WOW64) で実行されている 32 ビット Windows アプリケーションは、64 ビット アプリケーションとは異なるレジストリ ビューを参照します。 レジストリ リフレクションにより、このような 2 つのレジストリ ビュー間で一部のレジストリ値はコピーされます。- msidbComponentAttributesUninstallOnSupersedence
- 1024
- 0x0400
MSIUNINSTALLSUPERSEDEDCOMPONENTS プロパティの設定は、すべてのコンポーネントに対してこのビットを設定する場合と同じ効果があります。
Windows インストーラー 4.0 以前: msidbComponentAttributesUninstallOnSupersedence 値はサポートされていないため、無視されます。- msidbComponentAttributesShared
- 2048
- 0x0800
DisableSharedComponent ポリシーを 1 に設定した場合、どのパッケージもこのビットで有効な共有コンポーネント機能を取得しません。
Windows インストーラー 4.0 以前: msidbComponentAttributesShared 値はサポートされていないため、無視されます。 -
Condition
-
この列には、コンポーネントがインストールされるかどうかを制御できる条件付きステートメントが含まれています。 条件が null の場合、または true と評価された場合、コンポーネントは有効になります。 条件が False と評価された場合、コンポーネントは無効になり、インストールされません。
Condition フィールドは、CostFinalize アクション中にのみコンポーネントを有効または無効にします。 CostFinalize の後にコンポーネントを有効または無効にするには、カスタム アクションまたは DoAction ControlEvent を使って MsiSetComponentState を呼び出す必要があります。
コンポーネントに対して Attributes 列の Transitive ビットが設定されていない限り、Condition 列の条件付きステートメントがその後の製品のメンテナンス インストールで False と評価された場合でも、コンポーネントはインストール後に有効のままになることに注意してください。
Component テーブルの Condition 列は、機能とコンポーネントのインストール状態への参照を含む条件式を受け入れます。 条件付きステートメントの構文については、「条件付きステートメントの構文」を参照してください。
-
KeyPath
-
この値は、コンポーネントに属するファイルまたはフォルダーを指し、インストーラーによってコンポーネントを検出するために使われます。 2 つのコンポーネントが同じキー パス値を共有することはできません。 この列の値は、MsiGetComponentPath 関数から返されるパスでもあります。
値が null でない場合、KeyPath は、Attribute 値に応じて Registry、ODBCDataSource、File テーブルのいずれかの主キーです。 KeyPath が null の場合、Directory_ 列のフォルダーがキー パスとして使われます。
インストーラーによって作成されたフォルダーは空になると削除されるため、CreateFolder テーブルにエントリを作成して、空のフォルダーで構成されるコンポーネントをインストールする必要があります。
Windows インストーラー コンポーネントに Windows リソース保護 (WRP) で保護されているファイルまたはレジストリ キー、または Windows ファイル保護 (WFP) で保護されているファイルがある場合、コンポーネントの KeyPath としてこのリソースを使う必要があることに注意してください。 この場合、Windows インストーラーはコンポーネントをインストール、更新、または削除しません。 保護されたリソースをインストール パッケージに含めてはいけません。 代わりに、Windows リソース保護でサポートされているリソース置換メカニズムを使う必要があります。 詳細については、「Windows インストーラーと Windows リソース保護の使用」を参照してください。
解説
コンポーネントと機能の関係については、「機能テーブル」を参照してください。
インストーラーは、レジストリの共有 DLL 参照カウントとは関係なく、共有 DLL を追跡します。 共有 DLL の参照カウントがレジストリに存在する場合、ファイルのインストール時にはインストーラーによって常にカウントがインクリメントされ、アンインストール時にはカウントがデクリメントされます。 msidbComponentAttributesSharedDllRefCount が設定されておらず、参照カウントがまだ存在しない場合、インストーラーによって作成されません。 レジストリの SharedDLLs 参照カウントは、System フォルダーに任意のファイルがインストールされた場合にインクリメントされることに注意してください。
msidbComponentAttributesSharedDllRefCount が設定されていない場合、コンポーネントがまだ必要であっても、別のアプリケーションによって削除されることがあります。 どのようにこの状況になるかを確認するために、次のシナリオを考えてみましょう。
- インストーラーを使うアプリケーションで、共有コンポーネントをインストールします。
- msidbComponentAttributesSharedDllRefCount ビットは設定されておらず、参照カウントはありません。 そのため、インストーラーによって参照カウントは開始されません。
- このコンポーネントを共有し、インストーラーを使わないレガシ アプリケーションがインストールされます。
- レガシ アプリケーションによって共有コンポーネントの参照カウントが作成され、インクリメントされます。
- レガシ アプリケーションがアンインストールされます。
- 共有コンポーネントの参照カウントがゼロにデクリメントされ、そのコンポーネントは削除されます。
- インストーラーを使うアプリケーションは、そのコンポーネントにアクセスできなくなります。
この動作を回避するには、msidbComponentAttributesSharedDllRefCount を設定します。
システム サービス コンポーネントは、そのような用途のために特別に設計されていない限り、run-from-source (ソースから実行する) として指定しないでください。 詳細については、「ServiceInstall テーブル」を参照してください。
システム フォルダーに格納される動的リンク ライブラリを含むコンポーネントには、run-from-source (ソースから実行する) インストールを有効にする属性を設定してはならないことに注意してください。 その理由は、機能に従って、または UI で設定することで、コンポーネントのインストール状態が run-from-source (ソースから実行する) に設定されると、その後の DLL に対する LoadLibrary の呼び出しが失敗するためです。
「機能の選択の状態の制御」も参照してください。