主键: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);
}
通过上边一系列的操作,我们就能得到安装软件的相关信息了。。。