C++對windows控制面板的操作
阿新 • • 發佈:2017-07-14
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控制面板的操作