1. 程式人生 > >C++對windows控制面板的操作

C++對windows控制面板的操作

display 問題 不要急 bcd wow bdd 64位 http pla

經常碰到程序無法卸載, 就老是罵微軟搞的什麽安裝方式,安裝好了不能卸載.

後來就打算研究一下windows是如何卸載程序的,一個程序安裝完後留下了什麽信息用於後面的卸載.

研究對象win7 64位, 程序npviewinie.

程序安裝後生成的最主要的註冊表項是在以下三個中

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall     64位程序

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall   32位程序

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall    安裝到當前用戶的程序,安裝時不需要管理員權限


比如HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{43DCBFFE-81BE-4077-8F84-E32DB69C6979}

{43DCBFFE-81BE-4077-8F84-E32DB69C6979}是程序的唯一ID,固定的,在{43DCBFFE-81BE-4077-8F84-E32DB69C6979}裏有程序的概要信息,比如:

DisplayName: npviewinie    程序名字,如果為空則不會顯示在卸載程序列表裏面

InstallLocation: D:\Program Files\npviewinie\   程序安裝位置

UninstallString:  MsiExec.exe /X{43DCBFFE-81BE-4077-8F84-E32DB69C6979}   程序卸載命令

如果安裝信息全都放在這裏那就簡單了,可是微軟搞的很復雜,它把這裏當成索引,在其他地方放了其他的東西.

其他地方保存了程序的相關信息,主要有以下幾處:

# => HKEY_CLASSES_ROOT\Installer\Components 
# => HKEY_CLASSES_ROOT\Installer\Features 
# => HKEY_CLASSES_ROOT\Installer\Patches 
# => HKEY_CLASSES_ROOT\Installer\Products 
# => HKEY_CLASSES_ROOT\Installer\UpgradeCodes

# => HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components 
# => HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products 
#=> HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UpgradeCodes

# => HKEY_CURRENT_USER\Software\Microsoft\Installer\Features 
# => HKEY_CURRENT_USER\Software\Microsoft\Installer\Products 
# => HKEY_CURRENT_USER\Software\Microsoft\Installer\UpgradeCodes

看吧,復雜吧,其中聯系它們在一起的是那個唯一ID,而且是壓縮過,比如剛才那個壓縮成了EFFBCD34EB187704F8483ED26BC99697.

其中有幾個比較重要的需要提一下:

在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\EFFBCD34EB187704F8483ED26BC99697\InstallProperties下

LocalPackage: C:\Windows\Installer\1645971.msi

這個C:\Windows\Installer\1645971.msi就是卸載包的位置,如果這個丟了(網上的精簡系統方法可能會涉及到這個),那麽卸載失敗的機會就降了一半.

另一半的機會在安裝包還存在的情況.安裝包的名字記錄在:

HKEY_CLASSES_ROOT\Installer\Products\EFFBCD34EB187704F8483ED26BC99697\SourceList

PackageName: npviewinie_zh_1.6.6.msi

位置記錄在:

HKEY_CLASSES_ROOT\Installer\Products\EFFBCD34EB187704F8483ED26BC99697\SourceList\Net

1: E:\code\npviewinie\doc\Install\1.6.6
位置不正確不要急,因為它找不到就會讓你選擇位置的.

 

總結:

1. 不要隨便動C:\Windows\Installer目錄下的東西,雖然它越來越大

2. 能用正常卸載最好

3. 如果不能正常卸載,在強制卸載的時候,最好找到所有註冊表然後一起刪除,尤其不要忘了那個在C:\Windows\Installer下的文件.

如果手動查找麻煩,那麽建議只刪除那個主要註冊表,然後再重裝一次軟件,再刪除.

4. 上面關於強制卸載時用重裝軟件的建議有一個小問題,在重裝軟件之後,所有的註冊表跟之前是一樣的,但有個東西不一樣,那就是在C:\Windows\Installer目錄下的文件名,這樣就導致之前的那個文件完全失去了聯系.真的成為了孤魂野鬼.

5.還有一種方法.我寫了一個腳本來強制刪除這些註冊表和文件,需要會運行腳本的人,腳本使用附錄有介紹.

 

附錄:

1. npviewinie程序從註冊表中獲取的所有相關註冊表和文件信息

安裝目錄: D:\Program Files\npviewinie\ 
安裝文件目錄: E:\code\npviewinie\doc\Install\1.6.6\ 
卸載命令: MsiExec.exe /X{43DCBFFE-81BE-4077-8F84-E32DB69C6979} 
主要註冊表路徑: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{43DCBFFE-81BE-4077-8F84-E32DB69C6979} 
卸載文件路徑: C:\Windows\Installer\1645971.msi 
安裝包文件路徑: E:\code\npviewinie\doc\Install\1.6.6\\npviewinie_zh_1.6.6.msi 
其他相關註冊表: 
HKEY_CLASSES_ROOT\Installer\Features\EFFBCD34EB187704F8483ED26BC99697 
HKEY_CLASSES_ROOT\Installer\Products\EFFBCD34EB187704F8483ED26BC99697 
HKEY_CLASSES_ROOT\Installer\UpgradeCodes\D970B879D13D71644B1842FAEEAD2150 
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UpgradeCodes\D970B879D13D71644B1842FAEEAD2150
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\EFFBCD34EB187704F8483ED26BC99697 
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\00DA8AC25B115D14E82A2D938699DD78 
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\0C86DB1A2A425AA4ABDD342F238B3D58 
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\439BCBF3DBE6C264F8A83C86B199B574 
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\7B6F588AB8E7D4F4EB92A12CB7A8EB7C 
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\8BAFF9E2E57CD2E409B6A3B513EAABD0 
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\A02CBC3755662E04EA045A3ECE68D2AF 
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\AD2FEFFDA9B68E44AA18B440BA31F000 
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\CC166F7311E02514B80CC34BF06B5DE8

2.腳本介紹

腳本下載地址: http://pan.baidu.com/s/1c0rMeuG

其中:

list_all_installed_program.rb 可以列出所有安裝的程序的名字

check_installed_program_health.rb 程序名    可以檢查程序是否可以卸載或程序是否還存在

check_installed_program_health.rb -v 程序名 可以查看程序的相關信息

check_installed_program_health.rb -d 程序名 可以刪除程序的相關信息,包括程序目錄,卸載包,所有註冊表

  

C++對windows控制面板的操作