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);

图片描述

求教啊 困惑我好几天!

回答:

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

  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);

}

以上是 RegQueryValueEx()读取乱码? 的全部内容, 来源链接: utcz.com/p/193162.html

回到顶部