2014-01-20 25 views
1

我試圖理解/解釋正在發生的事情如下:瞭解引用計數 - Windows安裝程序

1)A.msi創建一個目錄\路徑\爲\ FOO

2)B.微星發現\路徑\使用註冊表\ foo和增加了一些文件到該位置

3)如果B.msi被卸載,它增加了額外的文件被刪除

4)是否有更新版本A.msi的安裝(主要升級)在B.msi卸載之前安裝,隨後卸載B.msi會將其添加到\ path \的文件保留爲\ foo。 msiexec/x日誌看起來像這樣:

(SERVER)  MSI (s) (60:08) [14:09:33:018]: Disallowing uninstallation of component: 
{BIFF} since another client exists 

(SERVER)  MSI (s) (60:08) [14:09:33:019]: Disallowing uninstallation of component: 
{BAM} since another client exists 

(SERVER)  MSI (s) (60:08) [14:09:33:019]: Disallowing uninstallation of component: 
{HARVEY} since another client exists 

(SERVER)  MSI (s) (60:08) [14:09:33:019]: Disallowing uninstallation of component: 
{ETC} since another client exists 

因此,顯然,引用計數,對吧?但不是以我理解的方式。我會認爲,因爲每個文件都是用一個組件單獨包裝的,並且組件GUID是唯一的,所以兩個MSI之間的引用計數將保持類似的獨立/唯一性。

上次安裝程序是否贏得了目錄的所有權,並且目錄的所有權必然會干擾引用計數/刪除被計數的組件包裝的文件?有沒有人有鏈接/文件,他們可以與我分享這個話題?

+0

我通常在包從看到這條消息我們僅當客戶端具有相同的組件GUID時。我假設你沒有複製用於構建A.msi的項目文件並重新用於構建B.msi? (因爲這可能會導致重複的組件GUID) –

+0

正確。 Guids在A和B的組件之間是唯一的。唯一共享的是B設置爲屬性的目錄,從A寫入的註冊表項中讀取它。 – NickHansen

回答

0

「共享」有兩個單獨的概念。

  1. 共享組件,如果兩個組件具有相同的GUID,則會發生這種情況。

  2. 共享DLL,如果組件有sharedDllRefCount屬性集或文件已存在,則會發生這種情況。

記住,在這兩種情況下沒有文件夾共享,但文件(或其他資源,你在組件放置)

如果1和2混合,有時文件不上卸載刪除,那麼你必須手動刪除關於你問的官方文檔文件或correct the sharedDLL counter manually

對我找不到多少,除了這一點: http://msdn.microsoft.com/en-us/library/ms709304%28v=vs.85%29.aspx

+0

還有另一個地方可以引用文件,防止安裝程序刪除它們:[HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Installer \ UserData \ ... - 請參閱http://www.daviddeley.com/solutions/msiexec將/index.htm – pi3