RegQueryValueEx的奇怪字符

时间:2012-08-09 00:00:32

标签: c++ visual-c++ npapi

我正在创建一个NPAPI dll文件,我需要从注册表中获取一些信息,但是当我使用RegQueryValueEx时,我会得到一些奇怪的字符。

例如,我的电脑型号是“N310”,但我得到“Nfb1fb1”或“N $(”。

我很确定这是一个字符集问题,但我是C ++的新手,我需要一些帮助。

我正在使用Visual Studio 2010,而我的项目正在使用UNICODE字符集。

这是我的代码:

char lszValue[255];
std::string cadena;
HKEY hKey;
LONG returnStatus;
DWORD dwType=REG_SZ;
DWORD dwSize=255;

returnStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"HARDWARE\\DESCRIPTION\\System\\BIOS", NULL, KEY_READ, &hKey);
if (returnStatus == ERROR_SUCCESS) {
    returnStatus = RegQueryValueEx(hKey, L"SystemProductName", NULL, &dwType,(LPBYTE)&lszValue, &dwSize);
    lszValue[dwSize] = 0;
    cadena.assign(lszValue, dwSize);

    return cadena;
}

非常感谢,谢谢你们的进步。

1 个答案:

答案 0 :(得分:3)

如果您的项目使用UNICODE字符集,则可能所有WINAPI函数都绑定到unicode字符串,即RegQueryValueEx实际上RegQueryValueExW采用wchar_t数组,而不是char } array。

使用非Unicode的单字节项目时,该函数为RegQueryValueExA,它可以与char[]一起使用。

要使您的项目(非)unicode安全,请使用TCHAR宏而不是char。 试试这段代码:

DWORD const dwSize=255;
TCHAR lszValue[dwSize];
std::wstring cadena;

HKEY hKey;
LONG returnStatus;
DWORD dwType=REG_SZ;
returnStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"HARDWARE\\DESCRIPTION\\System\\BIOS", NULL, KEY_READ, &hKey);
if (returnStatus == ERROR_SUCCESS)
{
    returnStatus = RegQueryValueEx(hKey, L"SystemProductName", NULL, &dwType, (LPBYTE)&lszValue, &dwSize);
    lszValue[dwSize] = 0;
    cadena.assign(lszValue, dwSize);

    return cadena;
}

我改变了类型。可能还有其他错误/拼写错误。请记住,std :: wstring适用于wchar_t