//1.开发环境 VS 2013
//2.创建MFC应用程序
//3.选择基于对话框选项
//4.打开*.rc文件在对话框界面上拖入ListBox控件
//5.在*Dlg.cpp中插入
#define UNINSTALL_SOFT _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall")
LRESULT GetValue(HKEY hKey, LPCTSTR name, LPTSTR value, LPLONG size)
{
return ::RegQueryValueEx(hKey, name, NULL, NULL, (LPBYTE)value, (LPDWORD)size);
}
void DumpSoftware(LPCTSTR szKey, HKEY hParent, CListBox * mylist)
{
LRESULT lr;
HKEY hKey;
LONG size;
TCHAR buffer[MAX_PATH];
lr = RegOpenKey(hParent, szKey, &hKey);
//不能打开注册表
if (lr != ERROR_SUCCESS)
{
::MessageBox(NULL, _T("打开注册表失败!"), NULL, MB_ICONWARNING);
return;
}
size = sizeof(buffer);
lr = GetValue(hKey, _T("DisplayName"), &buffer[0], &size);
if (lr == ERROR_SUCCESS)
{
if (size > 0)
{
mylist->AddString(buffer);
}
}
RegCloseKey(hKey);
}
void ListReg(CListBox * mylist)
{
unsigned int index;
TCHAR buffer[MAX_PATH];
HKEY hKey;
HRESULT hr = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, UNINSTALL_SOFT, 0, KEY_READ, &hKey);
if (hr != ERROR_SUCCESS)
{
::MessageBox(NULL, _T("打开注册表失败!"), NULL, MB_ICONWARNING);
return;
}
for (index = 0;; index++)
{
hr = RegEnumKey(hKey, index, &buffer[0], sizeof(buffer));
switch (hr)
{
case ERROR_SUCCESS:
DumpSoftware(buffer, hKey, mylist);
break;
case ERROR_NO_MORE_ITEMS:
RegCloseKey(hKey);
return;
default:
RegCloseKey(hKey);
return;
}
}
RegCloseKey(hKey);
}
//6.在OnInitDialog函数中return之前插入
CListBox * mylist = (CListBox *)GetDlgItem(IDC_LIST1);
mylist->ResetContent(); //清空ListBox
//枚举注册表将所有安装软件信息装入一个ListBox控件里
ListReg(mylist);