RegQueryValueEx()读取乱码?

我想获取保存在注册表的系统信息 所有者 产品ID 系统类型 系统版本号 就产品ID乱码其他正常返回!

HKEY key;
DWORD dwSize;//长度
DWORD dwType = REG_SZ;//装载要读取的数据类型
wchar_t data[MAX_PATH];//系统类型
wchar_t data1[MAX_PATH];
wchar_t data2[MAX_PATH];//所有者
wchar_t data3[MAX_PATH];//版本号
wchar_t data4[MAX_PATH];//产品ID 
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", 0, KEY_QUERY_VALUE, &key) == 0)
{
    if (RegQueryValueEx(key, L"ProductName", 0, &dwType, NULL, &dwSize) == 0)//先试探一下最后一个参数的返回长度
    {
        RegQueryValueEx(key, L"ProductName", 0, &dwType, (LPBYTE)data, &dwSize);//读取系统类型

        RegQueryValueEx(key, L"RegisteredOwner", 0, &dwType, NULL, &dwSize);//试探返回长度
        RegQueryValueEx(key, L"RegisteredOwner", 0, &dwType, (LPBYTE)data2, &dwSize);//读取所有者

        RegQueryValueEx(key, L"ReleaseId", 0, &dwType, NULL, &dwSize);//试探返回长度
        RegQueryValueEx(key, L"ReleaseId", 0, &dwType, (LPBYTE)data3, &dwSize);//读取版本号

        RegQueryValueEx(key, L"ProductId", 0, &dwType, NULL, &dwSize);//试探返回长度
        RegQueryValueEx(key, L"ProductId", 0, &dwType, (LPBYTE)data4, &dwSize);//读取ID
        wsprintf(data1, L"系统类型: %s\n系统版本号: %s\n所有者: %s\n产品ID: %s", data,data3,data2,data4);
        
        
        MessageBox(h1, data1, L"", NULL);
    }

}
else
{
    MessageBox(h1, L"打开注册表失败!可能没有权限!", L"错误", NULL);
}
RegCloseKey(key);

图片描述

求教啊 困惑我好几天!

阅读 5.5k
1 个回答

先不说你这个乱码问题,首先你这个代码本身就有些地方是做无用功。

  1. 这里 &dwType 是返回检测用的,不是查询用的,查询的话要指针干什么?不需要的话,可以直接传 NULL。

  2. 探测长度意义何在?你又不分配内存,上面所有的探测大小的代码纯属多此一举。直接这样写不更好:
    DWORD dwSize = sizeof(data);
    RegQueryValueEx(key, L"ProductName", 0, NULL, (LPBYTE)data, &dwSize);

  3. 不知道你的内容到底有多长,你最后那么长串的内容居然保存到只有 260 字符的 Buffer 中。

  4. 没有检测中间的这些函数返回值是否正确。

经实际测试,发现 64 位系统有些是取不到,需要加上一个KEY_WOW64_64KEY标志位。代码如下:

HKEY hKey = NULL;
TCHAR szInfo[1024] = { 0 };
TCHAR szKey[] = TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion");
HWND hwnd = GetDesktopWindow();
struct _ValueInfo {
    PCTSTR valName;
    PCTSTR valDesc;
} valInfo[] = {
    { TEXT("ProductName"), TEXT("系统类型") },
    { TEXT("RegisteredOwner"), TEXT("系统版本号") },
    { TEXT("ReleaseId"), TEXT("所有者") },
    { TEXT("ProductId"), TEXT("产品ID") }
};

LONG lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szKey, 0, KEY_QUERY_VALUE | KEY_WOW64_64KEY, &hKey);
if (lResult == NO_ERROR)
{
    PTSTR lpInfo = szInfo;
    TCHAR szError[] = TEXT("error");
    int nItems = sizeof(valInfo) / sizeof(*valInfo);
    for (int i = 0; i < nItems; i++)
    {
        TCHAR szBuffer[256] = { 0 };
        DWORD dwBuffer = sizeof(szBuffer);
        lResult = RegQueryValueEx(hKey, valInfo[i].valName, 0, NULL, (BYTE *)szBuffer, &dwBuffer);
        if (lResult == NO_ERROR)
        {
            lpInfo += wsprintf(lpInfo, TEXT("[%s] - [%s]\n"), valInfo[i].valDesc, szBuffer);
        }
        else
        {
            lpInfo += wsprintf(lpInfo, TEXT("[%s] - [%s]\n"), valInfo[i].valDesc, szError);
        }
    }
    RegCloseKey(hKey);

    MessageBox(hwnd, szInfo, TEXT("info"), MB_OK);
}
else
{
    MessageBox(hwnd, TEXT("打开注册表失败!"), TEXT("error"), MB_OK);
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题