Windows インストーラーでは、コンポーネント GUID がすべてです。10 個のファイルをインストールした場合、それらはすべて固有のコンポーネント GUID を持ちます。これらのファイルのうちの 5 つが不要になり、他の 5 つのファイルに置き換わる製品にメジャー アップグレードを行う場合、明らかに、古いファイルをアップグレードに含めませんが、これらの 5 つの新しいファイルと 5 つの新しいコンポーネント GUID を追加します。言い換えれば、症状は、新しいファイルを追加したが、既存のコンポーネント GUID を保持したことを示唆しています。メジャー アップグレードには古い製品のアンインストールが含まれますが、同じコンポーネント GUID を使用すると、GUID の参照カウントがゼロにならず、それらのコンポーネント (したがってファイル) がアンインストールされることはありません。
また、コンポーネントが永続的とマークされていた場合、またはファイルが共有とマークされていた場合、ファイルは削除されません。コンポーネントを永続的にマークするとシステムに固定されるため、MSI を再構築して永続的でないとマークしても問題は解決しません。コンポーネントには追加の再カウントがあります。ファイルが明示的に共有としてマークされている場合、MSI 以外のインストールを介してインストールできる (コンポーネント GUID ref はカウントされない) ことを意味し、MSI には別のエントリがあると通知されているため、レジストリの SharedDlls にエントリが存在します。非 MSI クライアント。レジストリで SharedDlls を調べて、それが発生したかどうかを確認できます。コンポーネントの参照カウントを発見するのはより困難ですが、アップグレードの詳細なログが役立ちます。この VB スクリプトは、インストールされているすべてのコンポーネントとそれらを使用している製品を表示します。
オプション明示
パブリック インストーラー、fullmsg、comp、a、prod、fso、pname、ploc、pid、psorce
fso = CreateObject("Scripting.FileSystemObject") を設定します。
= fso.CreateTextFile("comps.txt", True) を設定します。
' Windows インストーラー オブジェクトに接続
インストーラーを設定 = CreateObject("WindowsInstaller.Installer")
a.writeline (「MSI コンポーネント」)
エラーで次に再開
For Each comp Ininstaller.components
a.writeline (comp & " は製品で使用されます:")
Installer.ComponentClients (comp) の各製品について
pid = インストーラー.コンポーネントパス (製品、コンポーネント)
pname = installer.productinfo (prod、「InstalledProductName」)
a.Writeline (" " & pname & " " & prod & "and is installed at " & pid)
次
次
enter code here