从 RegQueryValueEx 获取正确的值

发布于 2024-10-16 12:58:24 字数 1604 浏览 2 评论 0 原文

我正在尝试使用 RegQueryValueEx 从 Windows 注册表中提取 REG_SZ 类型的值,我得到了该值,只不过它在每个字母之前都充满了奇怪的“\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 不会相同。如果我将 buffer 转换为一个字符串,我只得到一个“{”,这是第一个值。我需要获取注册表中 devename 的值,然后才能更改注册表中的“NetworkAddress”。

I am trying to extract a value from the windows registry of type REG_SZ, using RegQueryValueEx, I got the value except it was riddled with strange "\000" before each letter.To show you what I mean here are some images:

Value I want(It is a device name of a wireless adapter)
enter image description here

Value I got:

enter image description here

here is the code:

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

comparing buffer and devName would not be the same because of the extra null characters .If I cast buffer to a string I simply got a "{" which is the first value.I need to get the value of the devename in the registry before I can change the "NetworkAddress" in the registry.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

欢烬 2024-10-23 12:58:24

由于您使用的是 WCHAR,我假设您正在使用 Unicode 支持进行编译。如果这是真的,那么 buffer 也需要是 WCHAR

Since you are using WCHAR, I assume you are compiling with Unicode support. If this is true, then also the buffer needs to be WCHAR.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文