示例程序一:读取注册表获取计算机上已安装程序的信息
Windows 系统中,安装程序都可以在注册表 HKEY_LOCAL_MACHINE\SoftWare\Microsoft\Windows\CurrentVersion\Uninstall 获取,并且xp、vista、win7、win8都一样
以下示例程序中:
结构体ApplicationInfoA用于记录每个安装程序的具体信息,至于为何在名称后面加A,主要是为了表明其下的信息全是用string记录的。
函数GetAllInstalledAppInfoA用于获取计算机上已安装程序的全部信息,它接受vector<ApplicationInfoA>引用类型的参数,并将获取的全部信息存放在该vector中。该程序执行成功返回0,执行失败则返回-1。
main()函数中演示了怎么使用:
vector<ApplicationInfoA> vAppInfo;
GetAllInstalledAppInfoA(vAppInfo);
在获取了安装程序的信息后,输出到D盘下的InstalledAppInfo.txt文件中。
[cpp]
#include <windows.h>
#include <iostream>
#include <TCHAR.H>
#include <vector>
using namespace std;
//
// 用于记录安装软件信息的结构体
//
struct ApplicationInfoA
{
string strName; // 软件名
string strDisplayName; // 显示的软件名
string strPublisher; // 发布者
string strVersion; // 版本
string strDisplayVersion; // 显示的版本
string strInstallLocation; // 安装的位置
};
//
// 获取具体的程序的键值Data
// hKey [in]
// --- 指向HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall的子键句柄
// lpszKeyValueName [in]
// --- hKey下面的子键名称
// lpszKeyValueName [in]
// --- 正如其名,键值的名称
// strKeyValue [out]
// --- 键值的Data
//
int _GetAppInfoA_(HKEY hKey, LPCSTR lpszAppName, LPCSTR lpszKeyValueName, string& strKeyValue)
{
int ret;
// 打开已安装软件的注册表键------------------------------------------------
HKEY hInstallAppKey;
ret = RegOpenKeyEx(hKey, lpszAppName, 0, KEY_ALL_ACCESS, &hInstallAppKey);
if (ret != ERROR_SUCCESS)
{
return -1;
}
// 获取已安装软件的注册表键的键值------------------------------------------
// 1.获取字符串大小(默认为字符串即REG_SZ)
DWORD dwKeyValueType = REG_SZ;
DWORD dwKeyValueDataSize = 0;
ret = RegQueryValueExA(
hInstallAppKey,
lpszKeyValueName,
NULL,
&dwKeyValueType,
NULL,
&dwKeyValueDataSize);
if (ret == ERROR_FILE_NOT_FOUND)
{
RegCloseKey(hInstallAppKey);
return 0;
}
else if (ret != ERROR_SUCCESS)
{
RegCloseKey(hInstallAppKey);
return -1;
}
// 2.获取字符串值
if (dwKeyValueType != REG_SZ) // 如果不是字符串类型则返回,有的安装程序此项不为字符串而为其他类型,忽略
{
RegCloseKey(hInstallAppKey);
return 0;
}
LPSTR lpszKeyValueData = new char[dwKeyValueDataSize + 1];
memset(lpszKeyValueData, 0, dwKeyValueDataSize + 1);
ret = RegQueryValueExA(
hInstallAppKey,
lpszKeyValueName,
NULL,
&dwKeyValueType,
(LPBYTE)lpszKeyValueData,
&dwKeyValueDataSize);
if (ret != ERROR_SUCCESS)
{
delete[] lpszKeyValueData;
RegCloseKey(hInstallAppKey);
return -1;
}
strKeyValue = lpszKeyValueData;
delete[] lpszKeyValueData;
// 关闭注册表键------------------------------------------------------------
RegCloseKey(hInstallAppKey);
return 0;
}
//
// 获取系统安装的程序信息并存储于参数vector中
// 成功执行返回0
// 执行失败则返回-1
//
int GetAllInstalledAppInfoA(vector<ApplicationInfoA>& vAppInfo)
{
int ret;
// 打开注册表键------------------------------------------------------------
HKEY hKey;
LPCSTR lpszSubKey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
ret = RegOpenKeyExA(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);
if (ret != ERROR_SUCCESS)
{
return -1;
}
// 获取子键&键值信息-------------------------------------------------------
DWORD dwSubKeysCnt; // 子键数量
DWORD dwMaxSubKeyNameLen; // 子键名字的最大长度(not including the terminating null character)
DWORD dwKeyValueCnt; // 键值的数量
DWORD dwMaxKeyValueNameLen; // 键值名字的最大长度(not including the terminating null character)
DWORD dwMaxKeyValueDataLen; // 键值数据的最大长度(in Bytes)