1

コマンド ラインから「msiexec /fm」コマンドを実行すると、特定の HKLM レジストリ キーが修復されていないことに気付きました。次のように C++ でこれを行うと、同じことが起こります。

状況はこうです。登録する必要のある COM DLL があります。この DLL の CLSID 情報は、MSI レジストリ テーブルにあります。インストール中に、MSI は情報をレジストリに配置します。CLSID キーを手動で削除して "msiexec /fm" の修復を行うと、レジストリ キーは適切に復元されます。同様に、DLL を指すレジストリのパスを手動で変更すると、MSI は文字列を元の値に修復します。

キーが修復されないワークフローが 1 つあります。マシンに新しいバージョンの DLL をドロップして、インストールに付属しているものを置き換えると、MSI は CLSID キーを修復しなくなります。DLL が同じではないため、このキーを修復すべきではないと MSI が判断しているようです。DLL が変更された場合でも、レジストリ キーを修正するために MSI 修復を強制する方法が必要です。

コマンド「msiexec /fdm」は、実際にはレジストリ キーを修正しますが、ファイルを元の状態に更新します。私の場合、サービス パックにインストールされているため、新しいファイルがあります。新しいファイルを残して、レジストリ キーのみを修正します。

4

1 に答える 1

2

私の推測では、DLL ファイルは、レジストリ キーを保持するコンポーネントの重要なメンバーであると思われます。デフォルトでは、キー メンバーが見つからない限り、コンポーネントは再インストールされません。コンポーネントの再インストールがトリガーされるようにするには、さらにいくつかのフラグを指定する必要があります。例 /fpem

http://technet.microsoft.com/en-us/library/cc759262(v=ws.10).aspx#BKMK_Repair

于 2013-01-10T07:21:42.027 に答える