コンポーネント テーブル

コンポーネント テーブルにはコンポーネントが一覧表示され、次の列があります。

Column 種類 キー Nullable
コンポーネント 識別子 N
ComponentId GUID N
Directory_ 識別子 N N
属性 整数 N N
条件 Condition N
キーパス 識別子 N

コンポーネント

コンポーネント レコードを識別します。

主テーブル キー。

ComponentId

このコンポーネント、バージョン、および言語に固有の文字列 GUID。

これらの GUID の文字は大文字である必要があることに注意してください。 GUIDGEN などのユーティリティでは、小文字を含む GUID を生成できます。 これらの有効なコンポーネント コード GUID を作成するには、小文字を大文字に変更する必要があります。

この列が null の場合、インストーラーはコンポーネントを登録せず、インストーラーによってコンポーネントを削除または修復することはできません。 これは、一時ファイルをクリーンアップするカスタム アクションや古い製品を削除するカスタム アクションなど、インストール中にのみコンポーネントが必要な場合に意図的に行われる可能性があります。 また、登録する必要のないユーザーのコンピューターにデータ ファイルをコピーする場合にも便利です。

Directory_

ディレクトリ テーブル内のエントリの外部キー。 これは、値に実際のパスが含まれているプロパティ名です。これは、 AppSearch アクション によって設定することも、ディレクトリ テーブルから取得した既定の設定で設定することもできます。

開発者は、ユーザー プロファイル フォルダーのいずれかにファイルを配置するコンポーネントの作成を避ける必要があります。 これらのファイルは、マルチユーザーの状況ですべてのユーザーが使用できるとは限らず、修復が必要であるとインストーラーがコンポーネントを永続的に表示する可能性があります。

ディレクトリ テーブルの列 1 への外部キー。

属性

この列には、リモート実行のオプションを指定するビット フラグが含まれています。 指定したビットを列の合計値に追加して、オプションを含めます。

注意

Web の場所からダウンロードされる.msi ファイルの場合は、コンポーネントをソースから実行できるように属性フラグを設定しないでください。 これは、Windows インストーラーの制限であり、INSTALLSTATE_BADCONFIGの機能状態を返すことができます。

ビット フラグ
msidbComponentAttributesLocalOnly
0
0x0000
コンポーネントをソースから実行することはできません。 機能に属するすべてのコンポーネントに対してこのビットを設定して、機能がネットワークから実行またはソースから実行されないようにします。 機能にコンポーネントがない場合、この機能では常に実行元と実行元のコンピューターが有効なオプションとして表示されることに注意してください。
msidbComponentAttributesSourceOnly
1
0x0001
コンポーネントはソースからのみ実行できます。 機能に属するすべてのコンポーネントに対してこのビットを設定して、機能がマイ コンピューターから実行されないようにします。 機能にコンポーネントがない場合、この機能では常に実行元と実行元のコンピューターが有効なオプションとして表示されることに注意してください。
msidbComponentAttributesOptional
2
0x0002
コンポーネントは、ローカルまたはソースから実行できます。
msidbComponentAttributesRegistryKeyPath
4
0x0004
このビットが設定されている場合、KeyPath 列の値が レジストリ テーブルのキーとして使用されます。 レジストリ テーブル内の対応するレコードの Value フィールドが null の場合、そのレコードの Name フィールドに "+"、"-"、または "*" を含めてはなりません。 詳細については、 レジストリ テーブルの [名前] フィールドの説明を参照してください。
HKCU Hive に書き込まれたレジストリ エントリには、このビットを設定することをお勧めします。 これにより、インストーラーは、同じコンピューターに複数のユーザーが存在する場合に必要な HKCU レジストリ エントリを書き込みます。
msidbComponentAttributesSharedDllRefCount
8
0x0008
このビットが設定されている場合、インストーラーはコンポーネントのキー ファイルの共有 DLL レジストリの参照カウントをインクリメントします。 このビットが設定されていない場合、インストーラーは参照カウントが既に存在する場合にのみ参照カウントをインクリメントします。
msidbComponentAttributesPermanent
16
0x0010
このビットが設定されている場合、インストーラーはアンインストール中にコンポーネントを削除しません。 インストーラーは、Windows インストーラー レジストリ設定にコンポーネントの追加のシステム クライアントを登録します。
msidbComponentAttributesODBCDataSource
32
0x0020
このビットが設定されている場合、KeyPath 列の値は ODBCDataSource テーブルのキーです。
msidbComponentAttributesTransitive
64
0x0040
このビットが設定されている場合、インストーラーは再インストール時に条件列のステートメントの値を再評価します。 値が以前に False で、True に変更された場合、インストーラーによってコンポーネントがインストールされます。 値が以前に True で False に変更された場合、コンポーネントにクライアントとして他の製品がある場合でも、インストーラーによってコンポーネントが削除されます。
このビットは推移的なコンポーネントに対してのみ設定する必要があります。 推移的コンポーネントの使用を参照してください。
msidbComponentAttributesNeverOverwrite
128
0x0080
このビットが設定されている場合、コンポーネントのキー パス ファイルまたはキー パス レジストリ エントリが既に存在する場合、インストーラーはコンポーネントをインストールまたは再インストールしません。 アプリケーションは、コンポーネントのクライアントとして自身を登録します。
このフラグは、レジストリ テーブルによって登録されているコンポーネントに対してのみ使用します。 AppIdClassExtensionProgIdMIMEVerb の各テーブルによって登録されたコンポーネントには、このフラグを使用しないでください。
msidbComponentAttributes64bit
256
0x0100
これを 64 ビット コンポーネントとしてマークするには、このビットを設定します。 この属性は、32 ビットコンポーネントと 64 ビット コンポーネントの両方を含むパッケージのインストールを容易にします。 このビットが設定されていない場合、コンポーネントは 32 ビット コンポーネントとして登録されます。
これが 32 ビット コンポーネントを置き換える 64 ビット コンポーネントの場合は、このビットを設定し、ComponentId 列に新しい GUID を割り当てます。
msidbComponentAttributesDisableRegistryReflection
512
0x0200
このビットを設定して、このコンポーネントの影響を受ける既存のレジストリ キーと新しいレジストリ キーすべてに対して Registry Reflection を無効にします。 このビットが設定されている場合、Windows インストーラーは、コンポーネントによってアクセスされる各キーに対して RegDisableReflectionKey を呼び出します。 このビットは、Windows インストーラー バージョン 4.0 で使用できます。 このビットは、32 ビット システムでは無視されます。 このビットは、Windows XP の 64 ビット バージョンでは無視されます。
[!注]
64 ビット Windows エミュレーター (WOW64) で実行されている 32 ビット Windows アプリケーションは、64 ビット アプリケーションとは異なるレジストリビューを参照します。 レジストリ リフレクションでは、これら 2 つのレジストリ ビューの間にいくつかのレジストリ値がコピーされます。


msidbComponentAttributesUninstallOnSupersedence
1024
0x0400
コンピューターに孤立したコンポーネントが残らないように、パッチ パッケージ内のコンポーネントにこのビットを設定します。 後続のパッチがインストールされている場合は、MsiPatchSequence テーブルの msidbPatchSequenceSupersedeE 以前の値でマークされ、最初のパッチを置き換えるために、Windows インストーラー 4.5 以降で msidbComponentAttributesUninstallOnSupersedence 値でマークされているコンポーネントの登録を解除およびアンインストールできます。 コンポーネントがこのビットでマークされていない場合、スーパースティング パッチをインストールすると、コンピューター上の未使用のコンポーネントが残る可能性があります。
MSIUNINSTALLSUPERSEDEDCOMPONENTS プロパティの設定は、すべてのコンポーネントに対してこのビットを設定する場合と同じ効果があります。
インストーラー 4.0 以前をWindowsします。msidbComponentAttributesUninstallOnSupersedence 値はサポートされておらず、無視されます。

msidbComponentAttributesShared
2048
0x0800
コンポーネントがシステムにインストールされている少なくとも 1 つのパッケージでこの属性値でマークされている場合、インストーラーはコンポーネントをすべてのパッケージでマーク済みとして扱います。 マークされたコンポーネントを共有するパッケージがアンインストールされた場合、Windowsインストーラー 4.5 は、アンインストール中のパッケージによってその最高バージョンがインストールされた場合でも、システム上のコンポーネントの最高バージョンを共有し続けることができます。
DisableSharedComponent ポリシーが 1 に設定されている場合、このビットで有効になっている共有コンポーネント機能はパッケージで取得されません。
インストーラー 4.0 以前をWindowsします。msidbComponentAttributesShared 値はサポートされておらず、無視されます。

条件

この列には、コンポーネントがインストールされているかどうかを制御できる条件付きステートメントが含まれています。 条件が null または true と評価された場合は、コンポーネントが有効になります。 条件が False と評価された場合、コンポーネントは無効になり、インストールされません。

[条件] フィールドでは、 CostFinalize アクション中にのみコンポーネントを有効または無効にします。 CostFinalize 後にコンポーネントを有効または無効にするには、カスタム アクションまたは DoAction ControlEvent を使用して MsiSetComponentState を呼び出す必要があります。

[属性] 列の推移ビットがコンポーネントに対して設定されていない限り、後続のメンテナンス インストールで後で [条件] 列の条件ステートメントが False と評価された場合でも、コンポーネントはインストール後も有効のままであることに注意してください。

コンポーネント テーブルの [条件] 列では、インストールされている機能とコンポーネントの状態への参照を含む条件式を受け入れます。 条件ステートメントの構文については、「条件付きステートメントの 構文」を参照してください。

キーパス

この値は、インストーラーがコンポーネントの検出に使用するコンポーネントに属するファイルまたはフォルダーを指します。 2 つのコンポーネントで同じキー パス値を共有することはできません。 この列の値は、 MsiGetComponentPath 関数によって返されるパスでもあります。

値が null でない場合、KeyPath は 、属性値に応じてレジストリ、 ODBCDataSource、または ファイル テーブル の主キーになります。 KeyPath が null の場合、Directory_列のフォルダーがキー パスとして使用されます。

インストーラーによって作成されたフォルダーは空になると削除されるため、 CreateFolder テーブル にエントリを作成して、空のフォルダーで構成されるコンポーネントをインストールする必要があります。

Windows インストーラー コンポーネントに、Windows Resource Protection (WRP) によって保護されているファイルまたはレジストリ キー、または Windows File Protection (WFP) によって保護されているファイルが含まれている場合、このリソースをコンポーネントの KeyPath として使用する必要があることに注意してください。 この場合、Windows インストーラーはコンポーネントをインストール、更新、または削除しません。 インストール パッケージには、保護されたリソースを含めないようにしてください。 代わりに、Windows Resource Protection でサポートされているリソース置換メカニズムを使用する必要があります。 詳細については、「Windows インストーラーとリソース保護Windows使用する」を参照してください。

解説

コンポーネントとフィーチャ間のリレーションシップの詳細については、「 フィーチャー テーブル」を参照してください。

インストーラーは、レジストリ内の共有 DLL 参照カウントとは別に、共有 DLL を追跡します。 共有 DLL の参照カウントがレジストリに存在する場合、インストーラーはファイルのインストール時に常にカウントをインクリメントし、アンインストール時にデクリメントします。 msidbComponentAttributesSharedDllRefCount が設定されておらず、参照カウントがまだ存在しない場合、インストーラーでは作成されません。 レジストリ内の SharedDLLs 参照数は、システム フォルダーにインストールされたすべてのファイルに対してインクリメントされることに注意してください。

msidbComponentAttributesSharedDllRefCount が設定されていない場合、必要な場合でも、別のアプリケーションでコンポーネントを削除できます。 これがどのように起こるかを確認するには、次のシナリオを検討してください。

  • インストーラーを使用するアプリケーションは、共有コンポーネントをインストールします。
  • msidbComponentAttributesSharedDllRefCount ビットが設定されておらず、参照カウントがありません。 したがって、インストーラーは参照カウントを開始しません。
  • このコンポーネントを共有し、インストーラーを使用しないレガシ アプリケーションがインストールされます。
  • レガシ アプリケーションは、共有コンポーネントの参照カウントを作成してインクリメントします。
  • レガシ アプリケーションがアンインストールされます。
  • 共有コンポーネントの参照カウントが 0 に減り、コンポーネントが削除されます。
  • インストーラーを使用するアプリケーションは、コンポーネントにアクセスできなくなります。

この動作を回避するには、 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