2012-08-09 105 views
0

我创建一个NPAPI DLL文件,我需要从注册表中获取一些信息,但是当我使用RegQueryValueEx时,我得到一些奇怪的字符。与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; 
} 

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

+0

我不会硬编码'dwSize = 255',这是脆弱的。你可以使用[数组大小帮助](http://stackoverflow.com/a/4064220/168225)或者'std :: array'来代替。 – 2012-08-09 07:53:22

回答

3

如果你的项目使用UNICODE字符集,那么很可能所有的WINAPI功能绑定到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

+2

我会建议:'typedef std :: basic_string tstring; tstring cadena;' – 2012-08-09 07:45:30