zoukankan      html  css  js  c++  java
  • VC 读注册表获取安装程序

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

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

     获取系统安装程序列表:

    // 获取系统安装程序列表 
     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"));

    运行结果:

  • 相关阅读:
    5,MongoDB 之 "$" 的奇妙用法
    4,MongoDB 之 $关键字 及 $修改器 $set $inc $push $pull $pop MongoDB
    3,MongoDB之数据类型
    2,MongoDB之增删改查及pymongo的使用
    1,MongoDB简介和安装
    19,Ubuntu安装之python开发
    18,Shell编程实战
    17,saltstack高效运维
    16.2,docker网络
    如何使用 window api 转换字符集?
  • 原文地址:https://www.cnblogs.com/qintangtao/p/2918301.html
Copyright © 2011-2022 走看看