zoukankan      html  css  js  c++  java
  • C++对windows控制面板的操作

    经常碰到程序无法卸载, 就老是骂微软搞的什么安装方式,安装好了不能卸载.
    
    后来就打算研究一下windows是如何卸载程序的,一个程序安装完后留下了什么信息用于后面的卸载.
    
    研究对象win7 64位, 程序npviewinie.
    
    程序安装后生成的最主要的注册表项是在以下三个中
    
    HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall     64位程序
    
    HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftWindowsCurrentVersionUninstall   32位程序
    
    HKEY_CURRENT_USERSOFTWAREMicrosoftWindowsCurrentVersionUninstall    安装到当前用户的程序,安装时不需要管理员权限
    
    
    比如HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftWindowsCurrentVersionUninstall{43DCBFFE-81BE-4077-8F84-E32DB69C6979}
    
    {43DCBFFE-81BE-4077-8F84-E32DB69C6979}是程序的唯一ID,固定的,在{43DCBFFE-81BE-4077-8F84-E32DB69C6979}里有程序的概要信息,比如:
    
    DisplayName: npviewinie    程序名字,如果为空则不会显示在卸载程序列表里面
    
    InstallLocation: D:Program Files
    pviewinie   程序安装位置
    
    UninstallString:  MsiExec.exe /X{43DCBFFE-81BE-4077-8F84-E32DB69C6979}   程序卸载命令
    
    如果安装信息全都放在这里那就简单了,可是微软搞的很复杂,它把这里当成索引,在其他地方放了其他的东西.
    
    其他地方保存了程序的相关信息,主要有以下几处:
    
    # => HKEY_CLASSES_ROOTInstallerComponents 
    # => HKEY_CLASSES_ROOTInstallerFeatures 
    # => HKEY_CLASSES_ROOTInstallerPatches 
    # => HKEY_CLASSES_ROOTInstallerProducts 
    # => HKEY_CLASSES_ROOTInstallerUpgradeCodes
    
    # => HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionInstallerUserDataS-1-5-18Components 
    # => HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionInstallerUserDataS-1-5-18Products 
    #=> HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionInstallerUpgradeCodes
    
    # => HKEY_CURRENT_USERSoftwareMicrosoftInstallerFeatures 
    # => HKEY_CURRENT_USERSoftwareMicrosoftInstallerProducts 
    # => HKEY_CURRENT_USERSoftwareMicrosoftInstallerUpgradeCodes
    
    看吧,复杂吧,其中联系它们在一起的是那个唯一ID,而且是压缩过,比如刚才那个压缩成了EFFBCD34EB187704F8483ED26BC99697.
    
    其中有几个比较重要的需要提一下:
    
    在HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionInstallerUserDataS-1-5-18ProductsEFFBCD34EB187704F8483ED26BC99697InstallProperties下
    
    LocalPackage: C:WindowsInstaller1645971.msi
    
    这个C:WindowsInstaller1645971.msi就是卸载包的位置,如果这个丢了(网上的精简系统方法可能会涉及到这个),那么卸载失败的机会就降了一半.
    
    另一半的机会在安装包还存在的情况.安装包的名字记录在:
    
    HKEY_CLASSES_ROOTInstallerProductsEFFBCD34EB187704F8483ED26BC99697SourceList
    
    PackageName: npviewinie_zh_1.6.6.msi
    
    位置记录在:
    
    HKEY_CLASSES_ROOTInstallerProductsEFFBCD34EB187704F8483ED26BC99697SourceListNet
    
    1: E:code
    pviewiniedocInstall1.6.6
    
    位置不正确不要急,因为它找不到就会让你选择位置的.
    
     
    
    总结:
    
    1. 不要随便动C:WindowsInstaller目录下的东西,虽然它越来越大
    
    2. 能用正常卸载最好
    
    3. 如果不能正常卸载,在强制卸载的时候,最好找到所有注册表然后一起删除,尤其不要忘了那个在C:WindowsInstaller下的文件.
    
    如果手动查找麻烦,那么建议只删除那个主要注册表,然后再重装一次软件,再删除.
    
    4. 上面关于强制卸载时用重装软件的建议有一个小问题,在重装软件之后,所有的注册表跟之前是一样的,但有个东西不一样,那就是在C:WindowsInstaller目录下的文件名,这样就导致之前的那个文件完全失去了联系.真的成为了孤魂野鬼.
    
    5.还有一种方法.我写了一个脚本来强制删除这些注册表和文件,需要会运行脚本的人,脚本使用附录有介绍.
    
     
    
    附录:
    
    1. npviewinie程序从注册表中获取的所有相关注册表和文件信息
    
    安装目录: D:Program Files
    pviewinie 
    安装文件目录: E:code
    pviewiniedocInstall1.6.6 
    卸载命令: MsiExec.exe /X{43DCBFFE-81BE-4077-8F84-E32DB69C6979} 
    主要注册表路径: HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftWindowsCurrentVersionUninstall{43DCBFFE-81BE-4077-8F84-E32DB69C6979} 
    卸载文件路径: C:WindowsInstaller1645971.msi 
    安装包文件路径: E:code
    pviewiniedocInstall1.6.6\npviewinie_zh_1.6.6.msi 
    其他相关注册表: 
    HKEY_CLASSES_ROOTInstallerFeaturesEFFBCD34EB187704F8483ED26BC99697 
    HKEY_CLASSES_ROOTInstallerProductsEFFBCD34EB187704F8483ED26BC99697 
    HKEY_CLASSES_ROOTInstallerUpgradeCodesD970B879D13D71644B1842FAEEAD2150 
    HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionInstallerUpgradeCodesD970B879D13D71644B1842FAEEAD2150
    HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionInstallerUserDataS-1-5-18ProductsEFFBCD34EB187704F8483ED26BC99697 
    HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionInstallerUserDataS-1-5-18Components0DA8AC25B115D14E82A2D938699DD78 
    HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionInstallerUserDataS-1-5-18ComponentsC86DB1A2A425AA4ABDD342F238B3D58 
    HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionInstallerUserDataS-1-5-18Components439BCBF3DBE6C264F8A83C86B199B574 
    HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionInstallerUserDataS-1-5-18Components7B6F588AB8E7D4F4EB92A12CB7A8EB7C 
    HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionInstallerUserDataS-1-5-18Components8BAFF9E2E57CD2E409B6A3B513EAABD0 
    HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionInstallerUserDataS-1-5-18ComponentsA02CBC3755662E04EA045A3ECE68D2AF 
    HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionInstallerUserDataS-1-5-18ComponentsAD2FEFFDA9B68E44AA18B440BA31F000 
    HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionInstallerUserDataS-1-5-18ComponentsCC166F7311E02514B80CC34BF06B5DE8
    
    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 程序名 可以删除程序的相关信息,包括程序目录,卸载包,所有注册表
    

      

  • 相关阅读:
    怎么修改android飞行模式wifi
    斐讯n1盒子装远程迅雷
    Spring使用大全
    面向对象7大设计原则
    Mybatis之SqlNode解析
    【转载】MongoDB的C#驱动程序教程
    【转载】 mongodb C# 基本类库
    【转载】列举MongoDB C#驱动的几个Query方法
    【转载】MongoDB开发学习
    【转载】sql全国省市区数据库建表过程
  • 原文地址:https://www.cnblogs.com/mypsq/p/7171771.html
Copyright © 2011-2022 走看看