lst0426 2023-04-03 08:42 采纳率: 16.7%
浏览 46

C++ 读取REG_DWORD 类型注册表值


HKEY hKEY;
    DWORD    dwValues    = 0;
    DWORD    dwType    = REG_DWORD;
    DWORD    cbData    = sizeof(DWORD);
 
    unsigned char  chbuf[50];
    CString strCompany = "";
    CString strSeries = "";
    HKEY  hkey;
    DWORD type(0);
    DWORD len(50);
    memset(chbuf, 0, sizeof(chbuf));
    if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"), 0, KEY_ALL_ACCESS, &hKEY))
    {
        ::RegQueryValueEx(hKEY, _T("InstallDate"), NULL, &dwType, (PBYTE)&dwValues, &cbData);
        if (ERROR_SUCCESS == ::RegQueryValueEx(hKEY, _T("InstallDate"), NULL, &dwType, (PBYTE)&dwValues, &cbData))
        {
            AfxMessageBox(_T("Success!1")); 
 
        }
        
        RegQueryValueEx(hKEY, _T("InstallDate"), 0, &type, chbuf, &len);
        if (ERROR_SUCCESS == ::RegQueryValueEx(hKEY, _T("InstallDate"), 0, &type, chbuf, &len))
        {
            strCompany.Format(_T("%s"), chbuf);
            AfxMessageBox(_T("Success!2")+strCompany);
        }
        /*if (!RegQueryValueEx(hKEY, _T("EditionID"), 0, &type, chbuf, &len))
        {
            G_bIsLicesed = chbuf[0];
        }*/
        ::RegCloseKey(hKEY);
    }

如何得到chbuf或者dwValues这个值,显示读取成功,但是这个值却是0 ,肯定不应该是0,而是注册表当中的数值,这个问题出在哪

  • 写回答

2条回答 默认 最新

  • 微软技术分享 优质创作者: 编程框架技术领域 2023-04-03 08:50
    关注

    根据你提供的代码,你已经成功地读取了注册表键值 "InstallDate",但是你尝试使用两种不同的方式来获取值:一种是使用 dwValues 变量来获取,另一种是使用 chbuf 字符数组来获取。然而,你在使用这些变量之前没有检查它们是否包含预期的值,这可能导致问题。

    首先,请确保注册表键值 "InstallDate" 的类型确实是 REG_DWORD。如果不是 REG_DWORD 类型,则尝试使用相应的数据类型来获取值。例如,如果键值的类型是 REG_SZ,则使用字符数组来获取值。

    其次,请检查 dwValues 和 chbuf 变量的值是否正确。为此,请在 AfxMessageBox 调用之前添加以下代码行,以便查看这些变量的值:

    CString strValues;
    strValues.Format(_T("%d"), dwValues);
    AfxMessageBox(_T("Success!1 ") + strValues);
    
    CString strChbuf(chbuf);
    AfxMessageBox(_T("Success!2 ") + strChbuf);
    

    如果 dwValues 或 chbuf 的值不正确,则可能需要调整缓冲区的大小,以便完全容纳键值数据。在这种情况下,请尝试增加 chbuf 数组的大小,例如:

    unsigned char chbuf[1024];
    DWORD len = sizeof(chbuf);
    memset(chbuf, 0, sizeof(chbuf));
    if (ERROR_SUCCESS == ::RegQueryValueEx(hKEY, _T("InstallDate"), 0, &type, chbuf, &len))
    {
        CString strChbuf(chbuf);
        AfxMessageBox(_T("Success!2 ") + strChbuf);
    }
    

    最后,请确保你使用正确的值名称。在你的示例中,你使用 "InstallDate" 作为键值名称,但该键值通常是包含日期时间信息的字符串值,而不是 DWORD 值。如果你确实希望获取 DWORD 值,请使用与该值名称匹配的键值名称。

    评论

报告相同问题?

问题事件

  • 创建了问题 4月3日