C++学习(九):访问注册表

//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);  
原文地址:https://www.cnblogs.com/liw66/p/12465912.html