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
コンポーネントをソースから実行することはできません。 run-from-network (ネットワークから実行する) または run-from-source (ソースから実行する) 機能にならないようにするには、機能に属するすべてのコンポーネントにこのビットを設定します。 機能にコンポーネントがない場合、機能の有効なオプションとして常に run-from-source (ソースから実行する) と run-from-my-computer (マイ コンピューターから実行する) が表示されます。
msidbComponentAttributesSourceOnly
1
0x0001
コンポーネントはソースからのみ実行できます。 run-from-my-computer (マイ コンピューターから実行する) 機能にならないようにするには、機能に属するすべてのコンポーネントにこのビットを設定します。 機能にコンポーネントがない場合、機能の有効なオプションとして常に run-from-source (ソースから実行する) と run-from-my-computer (マイ コンピューターから実行する) が表示されます。
msidbComponentAttributesOptional
2
0x0002
コンポーネントはローカルで、またはソースから実行できます。
msidbComponentAttributesRegistryKeyPath
4
0x0004
このビットを設定した場合、KeyPath 列の値は Registry テーブルのキーとして使われます。 Registry テーブルの対応するレコードの Value フィールドが null の場合、そのレコードの Name フィールドに「+」、「-」、または「*」を含めることはできません。 詳細については Registry テーブルの Name フィールドの説明を参照してください。
HKCU ハイブに書き込まれるレジストリ エントリには、このビットを設定することをお勧めします。 これにより、同じマシンに複数のユーザーがいる場合に、必要な HKCU レジストリ エントリがインストーラーによって確実に書き込まれます。
msidbComponentAttributesSharedDllRefCount
8
0x0008
このビットを設定した場合、インストーラーにより、コンポーネントのキー ファイルの共有 DLL レジストリにある参照カウントがインクリメントされます。 このビットが設定されていない場合、参照カウントが既に存在する場合にのみ、インストーラーによって参照カウントがインクリメントされます。
msidbComponentAttributesPermanent
16
0x0010
このビットを設定した場合、アンインストール時にインストーラーによってコンポーネントは削除されません。 インストーラーにより、Windows インストーラーのレジストリ設定にコンポーネントの追加システム クライアントが登録されます。
msidbComponentAttributesODBCDataSource
32
0x0020
このビットを設定した場合、KeyPath 列の値は ODBCDataSource テーブルのキーになります。
msidbComponentAttributesTransitive
64
0x0040
このビットを設定した場合、再インストール時にインストーラーによって Condition 列のステートメントの値は再評価されます。 値が以前は False で True に変わった場合、インストーラーによってコンポーネントがインストールされます。 値が以前は True で False に変わった場合、そのコンポーネントにクライアントとして他の製品が含まれている場合でも、インストーラーによってコンポーネントは削除されます。
このビットは、推移的コンポーネントにのみ設定するようにしてください。 「推移的コンポーネントの使用」を参照してください。
msidbComponentAttributesNeverOverwrite
128
0x0080
このビットを設定し、コンポーネントのキー パス ファイルまたはキー パスのレジストリ エントリが既に存在する場合、インストーラーによってコンポーネントのインストールまたは再インストールは行われません。 アプリケーションは、コンポーネントのクライアントとして自身を登録します。
このフラグは、Registry テーブルによって登録されているコンポーネントにのみ使ってください。 AppIdClassExtensionProgIdMIMEVerb テーブルによって登録されたコンポーネントには、このフラグを使わないでください。
msidbComponentAttributes64bit
256
0x0100
このコンポーネントを 64 ビット コンポーネントとしてマークするには、このビットを設定します。 この属性を指定すると、32 ビットと 64 ビットの両方のコンポーネントを含むパッケージのインストールが簡単になります。 このビットが設定されていない場合、このコンポーネントは 32 ビット コンポーネントとして登録されます。
これが 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
孤立したコンポーネントがコンピューター上に残らないようにするには、パッチ パッケージ内のコンポーネントに対してこのビットを設定します。 後続のパッチがインストールされ、最初のパッチを置き換えるために MsiPatchSequence テーブルの msidbPatchSequenceSupersedeEarlier 値でマークされている場合、Windows インストーラー 4.5 以降では、msidbComponentAttributesUninstallOnSupersedence 値を使ってマークされたコンポーネントを登録解除およびアンインストールすることができます。 コンポーネントがこのビットでマークされていない場合、置き換えるパッチをインストールすると、コンピューター上に未使用のコンポーネントが残る可能性があります。
MSIUNINSTALLSUPERSEDEDCOMPONENTS プロパティの設定は、すべてのコンポーネントに対してこのビットを設定する場合と同じ効果があります。
Windows インストーラー 4.0 以前: msidbComponentAttributesUninstallOnSupersedence 値はサポートされていないため、無視されます。

msidbComponentAttributesShared
2048
0x0800
システムにインストールされている少なくとも 1 つのパッケージでコンポーネントがこの属性値でマークされている場合、インストーラーはすべてのパッケージでそのコンポーネントがマークされているものとして扱います。 マークされたコンポーネントを共有するパッケージがアンインストールされた場合、Windows インストーラー 4.5 はシステム上にある最も高いバージョンのコンポーネントを (その最も高いバージョンがアンインストール対象のパッケージによってインストールされた場合であっても) 引き続き共有することができます。
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 値に応じて RegistryODBCDataSourceFile テーブルのいずれかの主キーです。 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 の呼び出しが失敗するためです。

機能の選択の状態の制御」も参照してください。

検証

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