VC 读注册表获取安装程序

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

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



 

获取系统安装程序列表:

  1. // 获取系统安装程序列表   
  2.  BOOL CMyListCtrlTestDlg::AllRegKey(HKEY hKey, LPCTSTR szDesKeyItem)   
  3.  {   
  4.      HKEY hSubKey;   
  5.      DWORD dwIndex = 0;   
  6.      long lResult;   
  7.      int i = 1;   
  8.     
  9.      lResult = RegOpenKeyEx(hKey, szDesKeyItem, 0, KEY_READ, &hSubKey);      // 打开注册表   
  10.      if(ERROR_SUCCESS == lResult) {   
  11.          TCHAR szKeyName[256] = { 0 };   
  12.          DWORD cbName = 256*sizeof(TCHAR);   
  13.     
  14.          lResult = RegEnumKeyEx(hSubKey, dwIndex, szKeyName, &cbName, 0, NULL, NULL, NULL);      // 获取字段   
  15.          while (lResult == ERROR_SUCCESS && lResult != ERROR_MORE_DATA){   
  16.              OutputDebugString(szKeyName);   
  17.     
  18.     
  19.              CString str;   
  20.              str.Format(_T("%d"), i);   
  21.     
  22.              i = m_MyList.InsertItem(i, str);        // 插入到List控件显示   
  23.              m_MyList.SetItemText(i,1,szKeyName);   
  24.     
  25.     
  26.              dwIndex = dwIndex + 1;          // 改变dwIndex,循环获取下移字段   
  27.              cbName = 256*sizeof(TCHAR);   
  28.              lResult = RegEnumKeyEx(hSubKey, dwIndex, szKeyName, &cbName, 0, NULL, NULL, NULL);   
  29.     
  30.              i++;   
  31.     
  32.          }   
  33.          RegCloseKey(hSubKey);       // 关闭注册表   
  34.          return TRUE;   
  35.      }   
  36.      RegCloseKey(hSubKey);   
  37.      return FALSE;   
  38.  }   


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

  1. BOOL SoftList::AllRegKey(HKEY hKey, LPCTSTR szDesKeyItem)  
  2. {  
  3.     HKEY hSubKey;  
  4.     DWORD dwIndex = 0;  
  5.     long lResult;  
  6.   
  7.     lResult = RegOpenKeyEx(hKey, szDesKeyItem, 0, KEY_READ, &hSubKey);      // 打开注册表  
  8.     if(ERROR_SUCCESS == lResult) {  
  9.         int id = 1;                     // 序号  
  10.         TCHAR s_name[256] = {0};        // 软件名            
  11.         TCHAR s_DisplayName[256] = {0};         // 显示名称  
  12.         TCHAR s_Publisher[256] = {0};           // 发布者  
  13.         TCHAR s_InstallDate[12] = {0};          // 安装日期  
  14.         DWORD s_EstimatedSize;                  // 大小  
  15.         TCHAR s_DisplayVersion[256] = { 0 };    // 版本  
  16.         DWORD cbName = 256*sizeof(TCHAR);     
  17.         DWORD cbName2 = sizeof(TCHAR);  
  18.   
  19.         DWORD typeSZ = REG_SZ;          // SZ 注册表类型  
  20.         DWORD typeDWORD = REG_DWORD;    // DWORD 注册表类型  
  21.   
  22.         lResult = RegEnumKeyEx(hSubKey, dwIndex, s_name, &cbName, 0, NULL, NULL, NULL);     // 获取字段  
  23.         while (lResult == ERROR_SUCCESS && lResult != ERROR_MORE_DATA){  
  24.             OutputDebugString(s_name);  
  25.   
  26.             CString str;  
  27.             str.Format(_T("%d"), id);  
  28.   
  29.             id = m_SoftList.InsertItem(id, str);        // 插入到List控件显示  
  30.             m_SoftList.SetItemText(id, 1, s_name);  
  31.   
  32.   
  33.             HKEY hItem;     // 下一级注册表句柄  
  34.             if(::RegOpenKeyEx(hSubKey, s_name, 0, KEY_READ, &hItem) == ERROR_SUCCESS){      // 提取下一级注册表程序的属性信息  
  35.                 if (::RegQueryValueEx(hItem, _T("DisplayName"), 0, &typeSZ, (LPBYTE)s_DisplayName, &cbName) == ERROR_SUCCESS) {  
  36.                     m_SoftList.SetItemText(id, 1, s_DisplayName);  
  37.                 }  
  38.   
  39.                 if (::RegQueryValueEx(hItem, _T("Publisher"), 0, &typeSZ, (LPBYTE)s_Publisher, &cbName) == ERROR_SUCCESS) {  
  40.                     m_SoftList.SetItemText(id, 2, s_Publisher);  
  41.                 }  
  42.   
  43.                 if (::RegQueryValueEx(hItem, _T("InstallDate"), 0, &typeSZ, (LPBYTE)s_InstallDate, &cbName) == ERROR_SUCCESS) {  
  44.                     if (s_InstallDate != NULL) {        // 判断是否为空  
  45.                         m_SoftList.SetItemText(id, 3, s_InstallDate);         
  46.                     }  
  47.                 }  
  48.   
  49.                 if (::RegQueryValueEx(hItem, _T("EstimatedSize"), 0, &typeDWORD, (LPBYTE)&s_EstimatedSize, &cbName2) == ERROR_SUCCESS) {  
  50.                     float f_Size = s_EstimatedSize/1024.0;  // DWORD 转换为 CString 类型  
  51.                     CString p_Size;  
  52.                     p_Size.Format(_T("%.2f M"), f_Size);  
  53.                       
  54.                     m_SoftList.SetItemText(id, 4, p_Size);  
  55.                 }  
  56.   
  57.                 if (::RegQueryValueEx(hItem, _T("DisplayVersion"), 0, &typeSZ, (LPBYTE)s_DisplayVersion, &cbName) == ERROR_SUCCESS) {  
  58.                     m_SoftList.SetItemText(id, 5, s_DisplayVersion);  
  59.                 }  
  60.                   
  61.                 ::RegCloseKey(hItem);   // 关闭二级注册表(程序属性信息)  
  62.             }  
  63.   
  64.   
  65.             dwIndex = dwIndex + 1;          // 改变dwIndex,循环获取下移字段  
  66.             cbName = 256*sizeof(TCHAR);  
  67.             lResult = RegEnumKeyEx(hSubKey, dwIndex, s_name, &cbName, 0, NULL, NULL, NULL);  
  68.   
  69.             id++;  
  70.   
  71.         }  
  72.         RegCloseKey(hSubKey);   // 关闭一级注册表(读取程序信息)  
  73.         return TRUE;  
  74.     }  
  75.     RegCloseKey(hSubKey);  
  76.     return FALSE;  
  77. }  

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

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


 

运行结果:

非常感谢博主的分享,借鉴了一下“二次读取注册表”代码,发现在一个小问题,有些软件名称读取不出来,在获取字段后,while循环开始处,加入cbName = 256*sizeof(TCHAR); 问题修复。
3楼  晓风残月xj 2014-07-18 19:44发表 [回复] [引用] [举报]
大牛,为什么只有带有自动删除安装的程序才有能读到安装路径?
2楼  GZZXBCXM2005 2013-09-26 23:08发表 [回复]
牛叉,就差个程序安装路径了。比如要写个代码运行360压缩
该咋整啊。知道了软件名能获取到安装路径么?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值