我想获取保存在注册表的系统信息 所有者 产品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);
求教啊 困惑我好几天!
先不说你这个乱码问题,首先你这个代码本身就有些地方是做无用功。
这里 &dwType 是返回检测用的,不是查询用的,查询的话要指针干什么?不需要的话,可以直接传 NULL。
探测长度意义何在?你又不分配内存,上面所有的探测大小的代码纯属多此一举。直接这样写不更好:
DWORD dwSize = sizeof(data);
RegQueryValueEx(key, L"ProductName", 0, NULL, (LPBYTE)data, &dwSize);
不知道你的内容到底有多长,你最后那么长串的内容居然保存到只有 260 字符的 Buffer 中。
没有检测中间的这些函数返回值是否正确。
经实际测试,发现 64 位系统有些是取不到,需要加上一个
KEY_WOW64_64KEY
标志位。代码如下: