从 RegQueryValueEx 获取正确的值
Posted
技术标签:
【中文标题】从 RegQueryValueEx 获取正确的值【英文标题】:Getting a proper value from RegQueryValueEx 【发布时间】:2011-02-08 10:16:31 【问题描述】:我正在尝试从REG_SZ
类型的 Windows 注册表中提取一个值,使用 RegQueryValueEx
,我得到了这个值,只是它在每个字母之前都充满了奇怪的“\000”。向你展示我的意思是一些图片:
我要的值(无线网卡的设备名)
我得到的价值:
代码如下:
HKEY hlistkey = NULL;
HKEY hkey = NULL;
int dwIndex=0;
string devName = returndevName(); //return current selected device name using iphlpapi.h
WCHAR KeyNameBuf[512];
DWORD keyNameSizBuf = 512;
char buffer[512];
RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("SYSTEM\\CurrentControlSet\\Control\\Class\\4D36E972-E325-11CE-BFC1-08002bE10318") ,0,KEY_READ, &hlistkey );
if(!hlistkey)
cout << "failed" << endl;
while(RegEnumKeyEx(hlistkey,dwIndex++,KeyNameBuf,&keyNameSizBuf,0,NULL,NULL,NULL) == ERROR_SUCCESS )
RegOpenKeyEx(hlistkey, KeyNameBuf, 0, KEY_READ | KEY_SET_VALUE, &hkey);
if(hkey)
keyNameSizBuf = 512;
if(RegQueryValueEx(hkey,TEXT("NetCfgInstanceId"), 0,NULL,(LPBYTE)buffer,&keyNameSizBuf ) == ERROR_SUCCESS )
if(strcmp(buffer,devName.c_str() ) ==0)
//set value here
RegCloseKey(hkey);
比较buffer
和devName
会因为额外的空字符而不同。如果我将缓冲区转换为字符串,我只会得到一个“”,这是第一个值。我需要获取注册表中的devename
,然后我才能更改注册表中的“NetworkAddress”。
【问题讨论】:
【参考方案1】:由于您使用的是WCHAR
,我假设您正在使用 Unicode 支持进行编译。如果这是真的,那么buffer
也需要是WCHAR
。
【讨论】:
我正在使用 netbeans 和 Mingw 作为编译器(因为我也在使用 QT),我不确定如何设置 unicode 支持,但是否因为 unicode 我在缓冲区中得到了空值?如果我将缓冲区设置为 WCHAR 类型,那么如何将缓冲区与 devname 进行比较。 @cftmon 是的,您得到空值是因为您将 unicode 字符串放入 ansi 缓冲区。有多种方法可以与 devname 进行比较: 1. 使用 std::wstring 作为 devname; 2.将unicode字符串转换为ansi; 3.通过在末尾放置A
来强制使用ansi版本的注册表功能(并使用char而不是WCHAR)以上是关于从 RegQueryValueEx 获取正确的值的主要内容,如果未能解决你的问题,请参考以下文章
使用 RegQueryValueEx 和 HKEY_PERFORMANCE_COUNTER 获取“Disk Bytes/sec%
通过 RegQueryValueEx 和 RegGetValue 获取注册表值时的奇怪行为 [重复]
RegQueryValueEx 的奇怪行为与另一个寄存器的返回值有关
使用 RegQueryValueEx 将 reg_sz 作为输入并将其用作 char 数组