自己写的读取注册表判断主机安装了哪些浏览器

原帖位置:http://blog.csdn.net/helonsy/article/details/7010941


[cpp]  view plain copy
  1. BOOL fIsBrowser(std::string& paraStrBrowser)  
  2. {// 判断是否是浏览器  
  3.   
  4.     if (std::string::npos != paraStrBrowser.find("Opera"))  
  5.     {  
  6.         paraStrBrowser = "Opera" ;  
  7.         return TRUE ;  
  8.     }  
  9.     else if (std::string::npos != paraStrBrowser.find("Internet Explorer"))  
  10.     {  
  11.         paraStrBrowser = "IE" ;  
  12.         return TRUE ;  
  13.     }  
  14.     else if (std::string::npos != paraStrBrowser.find("Firefox"))  
  15.     {  
  16.         paraStrBrowser = "Firefox" ;  
  17.         return TRUE ;  
  18.     }  
  19.     else if (std::string::npos != paraStrBrowser.find("Safari"))  
  20.     {  
  21.         paraStrBrowser = "Safari" ;  
  22.         return TRUE ;  
  23.     }  
  24.     else if (std::string::npos != paraStrBrowser.find("Tencent Traveler"))  
  25.     {  
  26.         paraStrBrowser = "腾讯TT" ;  
  27.         return TRUE ;  
  28.     }  
  29.     else if (std::string::npos != paraStrBrowser.find("搜狗高速浏览器"))  
  30.     {  
  31.         paraStrBrowser = "Sogo" ;  
  32.         return TRUE ;  
  33.     }  
  34.     else if (std::string::npos != paraStrBrowser.find("傲游"))  
  35.     {  
  36.         paraStrBrowser = "傲游" ;  
  37.         return TRUE ;  
  38.     }  
  39.     else if (std::string::npos != paraStrBrowser.find("360安全浏览器"))  
  40.     {  
  41.         paraStrBrowser = "360" ;  
  42.         return TRUE ;  
  43.     }  
  44.     else if (std::string::npos != paraStrBrowser.find("Chrome"))  
  45.     {  
  46.         paraStrBrowser = "Chrome" ;  
  47.         return TRUE ;  
  48.     }  
  49.   
  50.     paraStrBrowser.erase() ;  
  51.     return FALSE ;  
  52. }  
  53.   
  54. std::string strGetSubKeyValue(std::string& paraStrRegPath)  
  55. {  
  56.     HKEY hKey;  
  57.     long lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, paraStrRegPath.c_str(), 0, KEY_READ,&hKey);  
  58.     if (0 != lRet)  
  59.     {  
  60.         MessageBox(NULL, "从注册表中获取浏览器名称失败""Error", MB_OK) ;  
  61.         exit(1) ;  
  62.     }  
  63.   
  64.     int     dwIndex = 0 ;   
  65.     char    szValueName[MAX_PATH] = {0} ;   
  66.     DWORD   dwValueVameLen = MAX_PATH ;   
  67.     DWORD   dwType;   
  68.     union  
  69.     {  
  70.         BYTE data[1024];   
  71.         DWORD idata;   
  72.     }lpdata;   
  73.     DWORD dwDataLen = sizeof(lpdata);   
  74.     DWORD Type ;  
  75.     memset(&lpdata, 0, sizeof(lpdata));   
  76.     while(RegEnumValue(hKey, dwIndex, (LPTSTR)szValueName, &dwValueVameLen, 0, &Type, lpdata.data, &dwDataLen) != ERROR_NO_MORE_ITEMS)   
  77.     {   
  78.         if (!strcmp(szValueName, "DisplayName"))  
  79.         {// 相等看其Value是否是浏览器  
  80.   
  81.             std::string strTemp((char*)lpdata.data) ;  
  82.             if (fIsBrowser(strTemp))  
  83.             {// 如果是的话,那么在函数内部做处理,然后返回  
  84.                 return strTemp ;  
  85.             }  
  86.             else  
  87.             {  
  88.                 return "" ;  
  89.             }  
  90.         }  
  91.   
  92.         dwIndex++;   
  93.         dwValueVameLen  =   sizeof(szValueName);   
  94.         dwDataLen       =   sizeof(lpdata);   
  95.         memset(&lpdata, 0, sizeof(lpdata));   
  96.     }  
  97.   
  98.     RegCloseKey(hKey) ;  
  99.   
  100.     return "" ;  
  101. }  
  102.   
  103. vector<pair<std::string, float>> vecGetBrowser()  
  104. {  
  105.     vector<pair<std::string, float>> retVecBrowser ;  
  106.   
  107.     const int MAX_KEY_LENGTH = 255 ;  
  108.     const int MAX_VALUE_NAME = 16383 ;  
  109.   
  110.     std::string strRegPath("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\") ;  
  111.   
  112.     // 读取注册表前期工作  
  113.     HKEY hKey ;  
  114.     if (0 != RegOpenKeyEx(HKEY_LOCAL_MACHINE, strRegPath.c_str(), 0, KEY_READ, &hKey))  
  115.     {  
  116.         MessageBox(NULL, "从注册表获取浏览器记录失败""Error", MB_OK) ;  
  117.         exit(1) ;  
  118.     }  
  119.   
  120.     // 开始遍历指定注册Key的Subkey  
  121.     DWORD dwCntSubKeys = 0 ;  
  122.     if(RegQueryInfoKey(hKey, NULL, NULL, NULL, &dwCntSubKeys, NULL, NULL, NULL, NULL, NULL, NULL, NULL))  
  123.     {  
  124.         MessageBox(NULL, "从注册表获取浏览器记录失败""Error", MB_OK) ;  
  125.         exit(1) ;  
  126.     }  
  127.   
  128.     if (!dwCntSubKeys)  
  129.     {  
  130.         return retVecBrowser ;  
  131.     }  
  132.   
  133.     char            szKey[MAX_KEY_LENGTH] = {0} ;  
  134.     DWORD           dwKeyLength = MAX_KEY_LENGTH ;  
  135.     std::string     strTmp("") ;  
  136.     std::string     strRegPathTmp("") ;  
  137.     for (int i = 0; i < dwCntSubKeys; ++i)  
  138.     {  
  139.         memset(szKey, 0 ,MAX_KEY_LENGTH) ;  
  140.         dwKeyLength = MAX_KEY_LENGTH ;  
  141.         //DWORD n1 = RegEnumKeyEx(hKey, i, szKey, &dwKeyLength, NULL, NULL, NULL, NULL) ;  
  142.         if (RegEnumKeyEx(hKey, i, szKey, &dwKeyLength, NULL, NULL, NULL, NULL))  
  143.         {  
  144.             MessageBox(NULL, "从注册表获取浏览器记录失败""Error", MB_OK) ;  
  145.             exit(1) ;  
  146.         }  
  147.         else  
  148.         {  
  149.             // 制造SubKey的Reg路径  
  150.             strRegPathTmp = strRegPath ;  
  151.             strRegPathTmp += szKey ;  
  152.             strRegPathTmp += "\\" ;  
  153.   
  154.             // 获取SubKey的Value,指定要浏览器名称  
  155.             strTmp = strGetSubKeyValue(strRegPathTmp) ;  
  156.             if (!strTmp.empty())  
  157.             {     
  158.                 pair<std::string, float> pairTemp ;  
  159.                 pairTemp.first  = strTmp ;  
  160.                 pairTemp.second = 0 ;  
  161.   
  162.                 // 首先判断该浏览器是否在,不在才加进去  
  163.                 if (retVecBrowser.end() == find(retVecBrowser.begin(), retVecBrowser.end(), pairTemp))  
  164.                 {  
  165.                     retVecBrowser.push_back(pairTemp) ;  
  166.                 }  
  167.             }  
  168.         }  
  169.     }  
  170.   
  171.     RegCloseKey(hKey) ;  
  172.   
  173.     return retVecBrowser ;  
  174. }  
因为有些软件 不是安装在 HKEY_lOACAL_MACHINES下面,而是安在: HKEY_UERS\S-1-5-21-*-500\Software\Microsoft\Windows\CurrentVersion\Uninstall\下面,下面贴出更新后完整的代码:
|
[cpp]  view plain copy
  1. BOOL fIsBrowser(std::string& paraStrBrowser)  
  2. {// 判断是否是浏览器  
  3.   
  4.     if (std::string::npos != paraStrBrowser.find("Opera"))  
  5.     {  
  6.         paraStrBrowser = "Opera" ;  
  7.         return TRUE ;  
  8.     }  
  9.     else if (std::string::npos != paraStrBrowser.find("Internet Explorer"))  
  10.     {  
  11.         paraStrBrowser = "IE" ;  
  12.         return TRUE ;  
  13.     }  
  14.     else if (std::string::npos != paraStrBrowser.find("Firefox"))  
  15.     {  
  16.         paraStrBrowser = "Firefox" ;  
  17.         return TRUE ;  
  18.     }  
  19.     else if (std::string::npos != paraStrBrowser.find("Safari"))  
  20.     {  
  21.         paraStrBrowser = "Safari" ;  
  22.         return TRUE ;  
  23.     }  
  24.     else if (std::string::npos != paraStrBrowser.find("Tencent Traveler"))  
  25.     {  
  26.         paraStrBrowser = "腾讯TT" ;  
  27.         return TRUE ;  
  28.     }  
  29.     else if (std::string::npos != paraStrBrowser.find("搜狗高速浏览器"))  
  30.     {  
  31.         paraStrBrowser = "Sogo" ;  
  32.         return TRUE ;  
  33.     }  
  34.     else if (std::string::npos != paraStrBrowser.find("傲游"))  
  35.     {  
  36.         paraStrBrowser = "傲游" ;  
  37.         return TRUE ;  
  38.     }  
  39.     else if (std::string::npos != paraStrBrowser.find("360极速浏览器"))  
  40.     {  
  41.         paraStrBrowser = "360" ;  
  42.         return TRUE ;  
  43.     }  
  44.     else if (std::string::npos != paraStrBrowser.find("Chrome"))  
  45.     {  
  46.         paraStrBrowser = "Chrome" ;  
  47.         return TRUE ;  
  48.     }  
  49.   
  50.     paraStrBrowser.erase() ;  
  51.     return FALSE ;  
  52. }  
  53.   
  54. std::string strGetSubKeyValue(HKEY paraHKey, std::string& paraStrRegPath)  
  55. {  
  56.     HKEY hKey;  
  57.     long lRet = RegOpenKeyEx(paraHKey, paraStrRegPath.c_str(), 0, KEY_READ,&hKey);  
  58.     if (0 != lRet)  
  59.     {  
  60.         MessageBox(NULL, "从注册表中获取浏览器名称失败""Error", MB_OK) ;  
  61.         exit(1) ;  
  62.     }  
  63.   
  64.     int     dwIndex = 0 ;   
  65.     char    szValueName[MAX_PATH] = {0} ;   
  66.     DWORD   dwValueVameLen = MAX_PATH ;   
  67.     DWORD   dwType;   
  68.     union  
  69.     {  
  70.         BYTE data[1024];   
  71.         DWORD idata;   
  72.     }lpdata;   
  73.     DWORD dwDataLen = sizeof(lpdata);   
  74.     DWORD Type ;  
  75.     memset(&lpdata, 0, sizeof(lpdata));   
  76.     while(RegEnumValue(hKey, dwIndex, (LPTSTR)szValueName, &dwValueVameLen, 0, &Type, lpdata.data, &dwDataLen) != ERROR_NO_MORE_ITEMS)   
  77.     {   
  78.         if (!strcmp(szValueName, "DisplayName"))  
  79.         {// 相等看其Value是否是浏览器  
  80.   
  81.             std::string strTemp((char*)lpdata.data) ;  
  82.             if (fIsBrowser(strTemp))  
  83.             {// 如果是的话,那么在函数内部做处理,然后返回  
  84.                 return strTemp ;  
  85.             }  
  86.             else  
  87.             {  
  88.                 return "" ;  
  89.             }  
  90.         }  
  91.   
  92.         dwIndex++;   
  93.         dwValueVameLen  =   sizeof(szValueName);   
  94.         dwDataLen       =   sizeof(lpdata);   
  95.         memset(&lpdata, 0, sizeof(lpdata));   
  96.     }  
  97.   
  98.     RegCloseKey(hKey) ;  
  99.   
  100.     return "" ;  
  101. }  
  102.   
  103. std::string& strGetS_1_5_21Path(std::string& paraStrPath)  
  104. {  
  105.     const int MAX_KEY_LENGTH = 255 ;  
  106.     const int MAX_VALUE_NAME = 16383 ;  
  107.   
  108.     HKEY hKey ;  
  109.     if (0 != RegOpenKeyEx(HKEY_USERS, NULL, 0, KEY_READ, &hKey))  
  110.     {  
  111.         MessageBox(NULL, "从注册表获取浏览器记录失败""Error", MB_OK) ;  
  112.         exit(1) ;  
  113.     }  
  114.   
  115.     DWORD dwCntSubKeys = 0 ;  
  116.     if(RegQueryInfoKey(hKey, NULL, NULL, NULL, &dwCntSubKeys, NULL, NULL, NULL, NULL, NULL, NULL, NULL))  
  117.     {  
  118.         MessageBox(NULL, "从注册表获取浏览器记录失败""Error", MB_OK) ;  
  119.         exit(1) ;  
  120.     }  
  121.   
  122.     char            szKey[MAX_KEY_LENGTH] = {0} ;  
  123.     DWORD           dwKeyLength = MAX_KEY_LENGTH ;  
  124.     for (int i = 0; i < dwCntSubKeys; ++i)  
  125.     {  
  126.         memset(szKey, 0 ,MAX_KEY_LENGTH) ;  
  127.         dwKeyLength = MAX_KEY_LENGTH ;  
  128.         //DWORD n1 = RegEnumKeyEx(hKey, i, szKey, &dwKeyLength, NULL, NULL, NULL, NULL) ;  
  129.         if (RegEnumKeyEx(hKey, i, szKey, &dwKeyLength, NULL, NULL, NULL, NULL))  
  130.         {  
  131.             MessageBox(NULL, "从注册表获取浏览器记录失败""Error", MB_OK) ;  
  132.             exit(1) ;  
  133.         }  
  134.         else  
  135.         {  
  136.             // 制造SubKey的Reg路径  
  137.             paraStrPath = szKey ;  
  138.             if (std::string::npos != paraStrPath.find("S-1-5-21-") && std::string::npos == paraStrPath.find("_Classes"))  
  139.             {  
  140.                 paraStrPath += "\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\" ;  
  141.                 return paraStrPath ;  
  142.             }  
  143.         }  
  144.     }  
  145.   
  146.     return paraStrPath ;  
  147. }  
  148.   
  149. vector<pair<std::string, float>>& vecGetBrowser(HKEY hKeyRoot, HKEY& hKey, const std::string& strRegPath, vector<pair<std::string, float>>& retVecBrowser)  
  150. {  
  151.     //vector<pair<std::string, float>> retVecBrowser ;  
  152.   
  153.     const int MAX_KEY_LENGTH = 255 ;  
  154.     const int MAX_VALUE_NAME = 16383 ;  
  155.   
  156.     //std::string strRegPath("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\") ;  
  157.   
  158.     // 读取注册表前期工作  
  159.     //HKEY hKey ;  
  160.     if (0 != RegOpenKeyEx(hKeyRoot, strRegPath.c_str(), 0, KEY_READ, &hKey))  
  161.     {  
  162.         MessageBox(NULL, "从注册表获取浏览器记录失败""Error", MB_OK) ;  
  163.         exit(1) ;  
  164.     }  
  165.   
  166.     // 开始遍历指定注册Key的Subkey  
  167.     DWORD dwCntSubKeys = 0 ;  
  168.     if(RegQueryInfoKey(hKey, NULL, NULL, NULL, &dwCntSubKeys, NULL, NULL, NULL, NULL, NULL, NULL, NULL))  
  169.     {  
  170.         MessageBox(NULL, "从注册表获取浏览器记录失败""Error", MB_OK) ;  
  171.         exit(1) ;  
  172.     }  
  173.   
  174.     if (!dwCntSubKeys)  
  175.     {  
  176.         return retVecBrowser ;  
  177.     }  
  178.   
  179.     char            szKey[MAX_KEY_LENGTH] = {0} ;  
  180.     DWORD           dwKeyLength = MAX_KEY_LENGTH ;  
  181.     std::string     strTmp("") ;  
  182.     std::string     strRegPathTmp("") ;  
  183.     for (int i = 0; i < dwCntSubKeys; ++i)  
  184.     {  
  185.         memset(szKey, 0 ,MAX_KEY_LENGTH) ;  
  186.         dwKeyLength = MAX_KEY_LENGTH ;  
  187.         //DWORD n1 = RegEnumKeyEx(hKey, i, szKey, &dwKeyLength, NULL, NULL, NULL, NULL) ;  
  188.         if (RegEnumKeyEx(hKey, i, szKey, &dwKeyLength, NULL, NULL, NULL, NULL))  
  189.         {  
  190.             MessageBox(NULL, "从注册表获取浏览器记录失败""Error", MB_OK) ;  
  191.             exit(1) ;  
  192.         }  
  193.         else  
  194.         {  
  195.             // 制造SubKey的Reg路径  
  196.             strRegPathTmp = strRegPath ;  
  197.             strRegPathTmp += szKey ;  
  198.             strRegPathTmp += "\\" ;  
  199.   
  200.             // 获取SubKey的Value,指定要浏览器名称  
  201.             strTmp = strGetSubKeyValue(hKeyRoot, strRegPathTmp) ;  
  202.             if (!strTmp.empty())  
  203.             {     
  204.                 pair<std::string, float> pairTemp ;  
  205.                 pairTemp.first  = strTmp ;  
  206.                 pairTemp.second = 0 ;  
  207.   
  208.                 // 首先判断该浏览器是否在,不在才加进去  
  209.                 if (retVecBrowser.end() == find(retVecBrowser.begin(), retVecBrowser.end(), pairTemp))  
  210.                 {  
  211.                     retVecBrowser.push_back(pairTemp) ;  
  212.                 }  
  213.             }  
  214.         }  
  215.     }  
  216.   
  217.     return retVecBrowser ;  
  218. }  
  219.   
  220. void vCaculateAverage(vector<pair<std::string, float>>& retVecBrowser)  
  221. {  
  222.     for (int i = 0; i < retVecBrowser.size(); ++i)  
  223.     {  
  224.         retVecBrowser[i].second = float(1) / retVecBrowser.size() ;  
  225.     }  
  226. }  
[cpp]  view plain copy
  1. // 获取浏览器种类名称  
  2.     std::string strPath("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\") ;  
  3.     vecGetBrowser(HKEY_LOCAL_MACHINE, hKey, strPath, pBrowser) ;  
  4.     std::string strS_1_5_21Path("") ;  
  5.     vecGetBrowser(HKEY_USERS, hKey, strGetS_1_5_21Path(strS_1_5_21Path), pBrowser) ;  
  6.     vCaculateAverage(pBrowser) ;  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值