获取本机安装程序信息

主键:HKEY_LOCAL_MACHINE

 

主键下的子键:"SOFTWARE//Microsoft//Windows//CurrentVersion//Uninstall"

 

他们下边的子键就是,如下图:

 

上边的信息就是安装在本机上的程序的相关信息。。。。

在他们的值中,有许多我们关心的东西,比如软件的色彩厂商,软件的名字。版本信息,等。。。

我想,windows优化大师的某些功能同样是基于以上的信息得到的,这里,我也通过枚举上边的信息来得到本机上

已经安装程序的信息吧。。。

主要的操作还是注册表的操作:

1:打开主键

2:枚举主键下的项,通过枚举,可以得到主键下的项的名字

3:通过上边得到的名字,我们可以更深一步的对下一次的子键进行查找,这个比较关键

这里通过了构造下层子键的路径的手法,再次打开注册表,来到子键的位置

4:通过上表的工作,我们就来到了子键的位置了,在这里,我们可以通过 RegQueryValueEx

来得到我们的信息。。。

具体代码如下:

 

//首先获得了 CLISTBOX 的句柄,因为我们在列表框上显示他们的信息的,然后清空

 m_pLstSolf = (CListBox*)GetDlgItem(LST_SOLFWARE);
 m_pLstSolf->ResetContent();

 

//定义了连个key,因为要打开两次注册表

 HKEY keyFirst = NULL, keySecond = NULL;

 

 char szSub[] = "SOFTWARE//Microsoft//Windows//CurrentVersion//Uninstall";


 char szName[200]   = {0};
 char szDisplay[200]  = {0};
 char szShow[200]   = {0};
 char szPublish[200]  = {0};
 char szVersion[200]  = {0};
 
 DWORD   dwVerlen = 200;
 DWORD   dwPublen = 200;
 DWORD   dwIndex   = 0, dwNameSize = 200, dwShowLen = 200;
 DWORD   m_attr=REG_BINARY | REG_DWORD | REG_EXPAND_SZ | REG_MULTI_SZ | REG_NONE | REG_SZ;
 
 int  i = 0;

 

 if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, szSub, 0, KEY_ALL_ACCESS, &keyFirst))
 {
  while(ERROR_NO_MORE_ITEMS != RegEnumKeyEx(keyFirst, dwIndex, szName, &dwNameSize, 0, NULL, NULL, 0))
  {
   dwIndex++;
   if (0 != strcmp(szName, ""))
   {
    strcpy(szDisplay, szSub);
    strcat(szDisplay, "//");
    strcat(szDisplay, szName);
    

    if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, szDisplay, 0, KEY_ALL_ACCESS, &keySecond))
    {
     RegQueryValueEx(keySecond, "DisplayName", NULL, &m_attr, (LPBYTE)szShow, &dwShowLen);
     RegQueryValueEx(keySecond, "Publisher", NULL, &m_attr, (LPBYTE)szPublish, &dwPublen);
     RegQueryValueEx(keySecond, "DisplayVersion", NULL, &m_attr, (LPBYTE)szVersion, &dwVerlen);
     if (0 != strcmp(szShow, "") || 0 != strcmp(szPublish, ""))
     {

      m_pLstSolf->InsertString(i++, "软件名称:");
      m_pLstSolf->InsertString(i++, szShow);
      m_pLstSolf->InsertString(i++, "版本号:");
      m_pLstSolf->InsertString(i++, szVersion);
      m_pLstSolf->InsertString(i++, "生产厂商:");
      m_pLstSolf->InsertString(i++, szPublish);

      
      m_pLstSolf->InsertString(i++, "===================================================");
     }
     
    }
    

   //清空内存,这很重要,我刚开始就是因为没有处理这,导致程序不能正确的得到我们想要的信息

   //这主要是覆盖的问题
    memset(szVersion, 0, sizeof(szVersion));
    memset(szPublish, 0, sizeof(szPublish));
    memset(szName, 0, sizeof(szName));
    memset(szDisplay, 0, sizeof(szDisplay));
    memset(szShow, 0, sizeof(szShow));
    dwNameSize = 200;
    dwShowLen = 200;
    dwPublen = 200;
    dwVerlen = 200;
   }
   
  }
 }
 
 if (keyFirst)
 {
  RegCloseKey(keyFirst);
 }
 if (keySecond)
 {
  RegCloseKey(keySecond);
 }

 

通过上边一系列的操作,我们就能得到安装软件的相关信息了。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值