コマンド ラインから「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」は、実際にはレジストリ キーを修正しますが、ファイルを元の状態に更新します。私の場合、サービス パックにインストールされているため、新しいファイルがあります。新しいファイルを残して、レジストリ キーのみを修正します。