• 5700阅读
  • 1回复

浅谈:利用QSettings来获取windows已安装程序名字列表的方法 [复制链接]

上一主题 下一主题
离线翩翩布衣
 

只看楼主 倒序阅读 楼主  发表于: 2011-08-07
这个问题困扰了我两个小时,最开始我以为必须要调用windows的api来读取注册表的才能达到这个目的。网上很多人博客上提到的方法都是调用windows的RegEnumKeyEx()这个函数(他们博客的内容都一样,估计都是复制别人的,非原创)。但是经过我一个多小时的调研和反复摸索发现就用QSettings完全可以完成这个功能,下面简单解释一下我的方法,给后人留下一些宝贵经验,让他们可以站在我的肩膀上:

1.首先找到注册表记录已安装程序的列表的具体位置,我的系统是xp所以具体位置是:
HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall   不知道winows 7上面是不是这个位置,可以自己找一下。

2. 定义一个链表来装最终的结果
QStringList  appInfoList;

3.调用QSettings的函数allKeys()来得到一个装有所有Uninstall目录下子键的QStringList,其中有一些是已安装程序的子键,还有一些我也不知道是什么,不管他们:
QStringList l_temp = QSettings("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall", QSettings::NativeFormat).allKeys();
列表中得某一项是一个QString,内容大概就是这样的“迅雷看看高清播放组件/DisplayName”这个DisplayName项对应的值就是我们要找的名字。

4.由于我们只需要已安装程序的名字,所以我们只留下含有“DisplayName”的项。于是就过滤一下第3步的那个链表并把DisplayName项对应的值
保留下来
foreach(QString t, l_temp)
  {
      if(t.contains("DisplayName")) //用contains来过滤
      {
          QString sysInfo = QSettings("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall",
                                      QSettings::NativeFormat).value(t).toString() + "\n";
          appInfoList.append(sysInfo);
      }
  }

这个appInfoList里面装的就是所以已安装程序的名字了。
是不是很简单?



离线wxj120bw

只看该作者 1楼 发表于: 2011-08-07
回 楼主(翩翩布衣) 的帖子
谢谢分享
快速回复
限100 字节
 
上一个 下一个