2012-10-04 60 views
0

當在Windows 7安裝程序(所有Windows版本將是真棒知道......但Windows 7將足以滿足現在)與MSI ...

- 什麼&到哪裏都是在變化中取得註冊表安裝以及所有這些更改如何相互關聯?

-I怎樣才能找到全部與給定安裝有關的數據我是否需要它,是否必須通過註冊表來獲取這些數據,或者是否有另一種更有效或更合適的方式來訪問數據?在Windows 7中安裝MSI時在註冊表中發生了什麼?

+1

這是微星的實現細節。它維護密鑰,以便它可以正確地重新安裝,更新和卸載應用程序。哪一個問題很重要,爲什麼這對你很重要?只是好奇心,還是你想解決一個實際問題?如果您好奇,可以使用SysInternals的ProcMon實用程序觀察正在讀取和寫入的密鑰。 –

+0

@HansPassant我的理由是我需要找出是否安裝了應用程序以及安裝的應用程序的版本是什麼。另一個原因是一般的好奇心和未來的參考...因此,我不只問如何找到當前安裝的版本。 – bsara

+1

你只能找到微星知道的數據,而不是'全部'數據。任何自定義操作,MSI不知道更改 - 您只能通過監視更改或向開發人員查找。他們正在爲MSI「外」。鮑勃斯回答最好'微星知道什麼' – saschabeaumont

回答

1

我一直在玩註冊表和安裝,看看我能想出什麼。 如果任何人可以進一步闡述我的答案或作出任何更正,將不勝感激,因爲這個答案只來自觀察,而不是來自任何官方來源。我已經制作了一些表格來描述我在下面的圖片中看到的結果。此外,爲了訪問所需的信息(IE,MSI的ProductName或ProductCode屬性),我遇到了WIX(http://wixtoolset.org/),並使用Micrsoft.Deployment.Installer.dll以及WIX包含的其他庫,因爲它們很漂亮當甜。

我不知道所有密鑰的官方條款&我在這裏引用的代碼...所以不要感到驚訝,如果它看起來像我製作它們是因爲它們似乎指定,因爲我做到了。

更新:我剛剛發現在MSI文檔一些有用的信息,可能在這裏讚賞:http://msdn.microsoft.com/en-us/library/windows/desktop/aa372105(v=vs.85).aspx

Analysis of windows 7 registry with respect to installations performed by an MSI

+1

即使他們看起來不像他們會在一段時間內改變,它仍然保持良好的建議,避免直接戳系統的內部器官,不依靠這些實現細節。 – BoltClock

+0

@BoltClock我會同意......但是當你沒有其他方式卡住時,這就派上用場了。 – bsara

2

使用MSI API,例如MsiGetProductInfoEx function。正如漢斯所言,註冊表數據大多是無證的,因爲它是一個實現細節。

0

使用MsiGetProductInfoEx(也可能是MsiEnumProductsEx)是推薦的編程方法獲取有關安裝產品的信息。使用這種方法,您可以比較對ProductCode,ProductVersion和包代碼(即版本號摘要屬性)值的更改。然而,對應用程序的小更新可能會使ProductCode和ProductVersion保持不變。一個典型的小型更新只會更改一個或兩個文件或一個註冊表項,在這種情況下,還應該更改軟件包代碼。但是,隨附語言轉換的產品可能與沒有轉換的產品具有相同的軟件包代碼。

如果您正在開發自己的Windows Installer軟件包,需要確定用戶是否已經安裝了該應用程序的某個版本,則可以使用Windows Installer服務在應用程序安裝期間搜索特定的文件或目錄。此方法需要在Windows安裝程序數據庫中填充相應的表,並且msi應運行AppSearch操作。這種方法在這裏描述的發佈微軟的Windows安裝程序文件中:

Searching for Existing Applications, Files, Registry Entries or .ini File Entries

相關問題