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