用MFC获取电脑安装软件信息并把它展示在列表控件

文章描述了一个C++函数CGetInfoDlg中的GetAppInfo方法,用于从Windows系统注册表中获取应用程序的名称、版本、出版者和安装位置。它通过遍历HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall子键来获取这些信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

void CGetInfoDlg::GetAppInfo()
{
    // TODO: 在此处添加实现代码.
    HKEY hKey;
    LONG result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall"), 0, KEY_READ, &hKey);
    if (result == ERROR_SUCCESS)
    {
        TCHAR subKeyName[MAX_PATH+1];
        DWORD subKeyIndex = 0;
        DWORD subKeyNameSize = sizeof(subKeyName);
        while (RegEnumKeyEx(hKey, subKeyIndex, subKeyName, &subKeyNameSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
        {
            HKEY subKey;
            result = RegOpenKeyEx(hKey, subKeyName, 0, KEY_READ, &subKey);
            if (result == ERROR_SUCCESS)
            {
                CString displayName;
                CString displayVersion;
                CString publisher;
                CString installLocation;

                result = GetValueFromRegistry(subKey, _T("DisplayName"), displayName);
                if (result == ERROR_SUCCESS&&!displayName.IsEmpty())
                {
                    GetValueFromRegistry(subKey, _T("DisplayVersion"), displayVersion);
                    GetValueFromRegistry(subKey, _T("Publisher"), publisher);
                    GetValueFromRegistry(subKey, _T("InstallLocation"), installLocation);

                    int index = m_appList.InsertItem(m_appList.GetItemCount(), displayName);
                    m_appList.SetItemText(index, 1, displayVersion);
                    m_appList.SetItemText(index, 2, publisher);
                    m_appList.SetItemText(index, 3, installLocation);
                }
                RegCloseKey(subKey);

            }
            subKeyIndex++;
            subKeyNameSize = sizeof(subKeyName);

        }
        RegCloseKey(hKey);
    }
}

LONG CGetInfoDlg::GetValueFromRegistry(HKEY hKey, LPCTSTR valueName, CString& value)
{
    // TODO: 在此处添加实现代码.

    DWORD valueSize=0;
    DWORD valueType;


    LONG result = RegQueryValueEx(hKey, valueName, NULL, &valueType, NULL, &valueSize);
    if (result == ERROR_SUCCESS && valueType == REG_SZ && valueSize > 0)
    {
        TCHAR* valueBuffer = new TCHAR[valueSize / sizeof(TCHAR)];
        result = RegQueryValueEx(hKey, valueName, NULL, &valueType, reinterpret_cast<LPBYTE>(valueBuffer), &valueSize);
        if (result == ERROR_SUCCESS)
        {
            value = valueBuffer;
        }
        delete[] valueBuffer;
    }
    return result;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值