VC 读注册表获取安装程序

时间:2022-06-12 06:37:06

Windows 系统中,安装程序都可以在注册表 HKEY_LOCAL_MACHINE\SoftWare\Microsoft\Windows\CurrentVersion\Uninstall 获取,并且xp、vista、win7、win8都一样

打开注册表命令:regedit,依次展开上述注册表路径,安装程序列表如下图:

VC 读注册表获取安装程序


 

获取系统安装程序列表:

// 获取系统安装程序列表  BOOL CMyListCtrlTestDlg::AllRegKey(HKEY hKey, LPCTSTR szDesKeyItem) 
{
HKEY hSubKey;
DWORD dwIndex = 0;
long lResult;
int i = 1;

lResult = RegOpenKeyEx(hKey, szDesKeyItem, 0, KEY_READ, &hSubKey); // 打开注册表
if(ERROR_SUCCESS == lResult) {
TCHAR szKeyName[256] = { 0 };
DWORD cbName = 256*sizeof(TCHAR);

lResult = RegEnumKeyEx(hSubKey, dwIndex, szKeyName, &cbName, 0, NULL, NULL, NULL); // 获取字段
while (lResult == ERROR_SUCCESS && lResult != ERROR_MORE_DATA){
OutputDebugString(szKeyName);


CString str;
str.Format(_T("%d"), i);

i = m_MyList.InsertItem(i, str); // 插入到List控件显示
m_MyList.SetItemText(i,1,szKeyName);


dwIndex = dwIndex + 1; // 改变dwIndex,循环获取下移字段
cbName = 256*sizeof(TCHAR);
lResult = RegEnumKeyEx(hSubKey, dwIndex, szKeyName, &cbName, 0, NULL, NULL, NULL);

i++;

}
RegCloseKey(hSubKey); // 关闭注册表
return TRUE;
}
RegCloseKey(hSubKey);
return FALSE;
}


 
获取安装程序属性信息(二次读取注册表):

BOOL SoftList::AllRegKey(HKEY hKey, LPCTSTR szDesKeyItem){HKEY hSubKey;DWORD dwIndex = 0;long lResult;lResult = RegOpenKeyEx(hKey, szDesKeyItem, 0, KEY_READ, &hSubKey);// 打开注册表if(ERROR_SUCCESS == lResult) {int id = 1;// 序号TCHAR s_name[256] = {0};// 软件名TCHAR s_DisplayName[256] = {0};// 显示名称TCHAR s_Publisher[256] = {0};// 发布者TCHAR s_InstallDate[12] = {0};// 安装日期DWORD s_EstimatedSize;// 大小TCHAR s_DisplayVersion[256] = { 0 };// 版本DWORD cbName = 256*sizeof(TCHAR);DWORD cbName2 = sizeof(TCHAR);DWORD typeSZ = REG_SZ;// SZ 注册表类型DWORD typeDWORD = REG_DWORD;// DWORD 注册表类型lResult = RegEnumKeyEx(hSubKey, dwIndex, s_name, &cbName, 0, NULL, NULL, NULL);// 获取字段while (lResult == ERROR_SUCCESS && lResult != ERROR_MORE_DATA){OutputDebugString(s_name);CString str;str.Format(_T("%d"), id);id = m_SoftList.InsertItem(id, str);// 插入到List控件显示m_SoftList.SetItemText(id, 1, s_name);HKEY hItem;// 下一级注册表句柄if(::RegOpenKeyEx(hSubKey, s_name, 0, KEY_READ, &hItem) == ERROR_SUCCESS){// 提取下一级注册表程序的属性信息if (::RegQueryValueEx(hItem, _T("DisplayName"), 0, &typeSZ, (LPBYTE)s_DisplayName, &cbName) == ERROR_SUCCESS) {m_SoftList.SetItemText(id, 1, s_DisplayName);}if (::RegQueryValueEx(hItem, _T("Publisher"), 0, &typeSZ, (LPBYTE)s_Publisher, &cbName) == ERROR_SUCCESS) {m_SoftList.SetItemText(id, 2, s_Publisher);}if (::RegQueryValueEx(hItem, _T("InstallDate"), 0, &typeSZ, (LPBYTE)s_InstallDate, &cbName) == ERROR_SUCCESS) {if (s_InstallDate != NULL) {// 判断是否为空m_SoftList.SetItemText(id, 3, s_InstallDate);}}if (::RegQueryValueEx(hItem, _T("EstimatedSize"), 0, &typeDWORD, (LPBYTE)&s_EstimatedSize, &cbName2) == ERROR_SUCCESS) {float f_Size = s_EstimatedSize/1024.0;// DWORD 转换为 CString 类型CString p_Size;p_Size.Format(_T("%.2f M"), f_Size);m_SoftList.SetItemText(id, 4, p_Size);}if (::RegQueryValueEx(hItem, _T("DisplayVersion"), 0, &typeSZ, (LPBYTE)s_DisplayVersion, &cbName) == ERROR_SUCCESS) {m_SoftList.SetItemText(id, 5, s_DisplayVersion);}::RegCloseKey(hItem);// 关闭二级注册表(程序属性信息)}dwIndex = dwIndex + 1;// 改变dwIndex,循环获取下移字段cbName = 256*sizeof(TCHAR);lResult = RegEnumKeyEx(hSubKey, dwIndex, s_name, &cbName, 0, NULL, NULL, NULL);id++;}RegCloseKey(hSubKey);// 关闭一级注册表(读取程序信息)return TRUE;}RegCloseKey(hSubKey);return FALSE;}

通过注册表路径获取调用:

AllRegKey(HKEY_LOCAL_MACHINE, TEXT("SoftWare\\Microsoft\\Windows\\CurrentVersion\\Uninstall"));


 

运行结果:
VC 读注册表获取安装程序