这个问题困扰了我两个小时,最开始我以为必须要调用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里面装的就是所以已安装程序的名字了。
是不是很简单?