使用RegQueryValueEx作为可能为REG_DWORD或REG_SZ的注册表值

Posted vv1025

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用RegQueryValueEx作为可能为REG_DWORD或REG_SZ的注册表值相关的知识,希望对你有一定的参考价值。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

提示:这里可以添加本文要记录的大概内容:

例如:以下是官方博客例子浅析

先加入相关的头文件和库文件。
您的问题与RegEnumValue()无关。

您的应用程序正在调用基于TCHAR的RegQueryValueEx() ,它实际上是一个预处理器宏,它取决于在编译时是否定义了UNICODE ,因此映射到RegQueryValueExA() (ANSI)或RegQueryValueExW() (Unicode)。

RegQueryValueEx

从 RegQueryValueEx 获取正确的值

【中文标题】从 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作为可能为REG_DWORD或REG_SZ的注册表值的主要内容,如果未能解决你的问题,请参考以下文章

将 RegQueryValueEx 用于可能是 REG_DWORD 或 REG_SZ 的注册表值

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

从 RegQueryValueEx 获取正确的值

RegQueryValueEx正确使用方法

使用 RegQueryValueEx 和 HKEY_PERFORMANCE_COUNTER 获取“Disk Bytes/sec%

RegQueryValueEx 的奇怪行为与另一个寄存器的返回值有关