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

比较bufferdevName 会因为额外的空字符而不同。如果我将缓冲区转换为字符串,我只会得到一个“”,这是第一个值。我需要获取注册表中的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 数组

如何在 C++ 中使用 RegQueryValueEx(..) 从注册表中读取 REG_MULTI_SZ 类型值

从 Hive QL 中的数组获取正确的值