c++ - RegQueryValueEx 的奇怪字符

标签 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;
}

非常感谢,感谢您的提前。

最佳答案

如果您的项目使用 UNICODE 字符集,那么可能所有的 WINAPI 函数都绑定(bind)到 unicode 字符串,也就是说,RegQueryValueEx 实际上是 RegQueryValueExW 接受 wchar_t 数组,而不是 char 数组。

当使用非 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

关于c++ - RegQueryValueEx 的奇怪字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11874959/

相关文章:

cocoa - 嵌入式Webkit - 脚本回调如何?

c++ - 如何编写浏览器插件?

c++ - 分割函数c++

c++ - MSVC9 : How do I view a location in memory?

visual-c++ - __stdcall 和 _stdcal 有什么区别?

c++ - const_cast with bool : if condition ignored

npapi - Edge 中 Chrome native 消息传递的等效项

使用 g++ -c : compiler recognizes a const string& as int 的 c++ 编译器错误

c++ - 异常处理器

c++ - Visual Studio 2010 中 shared_ptr 的编译器错误