c++ - 使用 RegEnumValue 显示值名称和数据

标签 c++ winapi

我有以下代码:

#include <Windows.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


using namespace std;

int main(int argc, wchar_t*argv[])
{

    std::locale::global(std::locale("spanish"));


    /*Declaración de variables*/

    HKEY hKey = HKEY_CURRENT_USER;
    LPCTSTR lpSubKey = TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\RunMRU");
    DWORD ulOptions = 0;
    REGSAM samDesired = KEY_READ | KEY_WRITE;
    HKEY phkResult;
    DWORD dwIndex = 0;
    TCHAR lpValueName[16383];
    DWORD lpcchValueName = 16383;
    LPTSTR lpData="";

    long OpenK = RegOpenKeyEx(hKey, lpSubKey, ulOptions, samDesired, &phkResult);

    if (OpenK == ERROR_SUCCESS)
    {
        long R = RegEnumValue(phkResult, dwIndex, lpValueName, &lpcchValueName, NULL, NULL,(LPBYTE)lpData, NULL);


        if (R == ERROR_SUCCESS)
        {
            cout << "The value and data is: \n" << lpValueName << ": " << lpData << endl;
            //printf(TEXT("(%d) %s\n"), lpValueName);
        }
        else
            cout << "Error: " << R << endl;

    }
    else if (OpenK == ERROR_FILE_NOT_FOUND)
    {
        cout << "La sub-clave RunMRU no existe." << endl;
    }
    else if (OpenK == ERROR_ACCESS_DENIED)
    {
        cout << "Acceso denegado al abrir la sub-clave RunMRU." << endl;
    }
    else
    {
        cout << "Error al abrir la clave de registro. Código: " << OpenK << endl;

    }


    system("Pause");


}

我试图在第一个 if 中使用 RegEnumValue 显示值名称及其数据(值和数据是:),但我只能显示值名称。

有什么办法吗?我试图弄清楚如何使用 lpData,但我做不到,因为我只收到错误 87(不正确的参数)或什么都没有(如果我改为设置 NULL)。

最佳答案

您没有为 RegEnumValue() 提供合适的缓冲区来存储数据。

LPTSTR lpData="";

这只是一个字符串文字,大小最多为 2 个字节,而且几乎肯定是不可写的。您需要分配一个内存区域并将其传递给 RegEnumValue() 以读取每个值的数据。

您的第一步应该是使用 RegQueryInfoKey() 找出最大数据值有多大。我向您展示了如何在 previous answer 中使用此功能查询最大值名称的大小——过程是一样的。请参阅 RegQueryInfoKey() 的文档找出哪个参数提供数据大小。

一旦知道最大的数据项有多大,就为它分配一个缓冲区:

void* pData = malloc(dwLargestValueSize);
// remember this buffer needs to be freed at the end with free()

然后您将该缓冲区加上一个指示其大小的值传递给 RegEnumValue()

您还需要注意的是,注册表值可以是不同的类型 - REG_DWORDREG_SZ 等,以及您从 获取的数据RegEnumValue() 是原始数据。 RegEnumValue() 也可以返回一个指示数据类型的值,如果您要正确解释它,您绝对需要同时检查它。

关于c++ - 使用 RegEnumValue 显示值名称和数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19261113/

相关文章:

c++ - 示例解析错误

ruby - 尝试用 Ruby 显示气球通知

c++ - 为什么 webrtc 找不到它建议的捕获器?

c++ - 没有数据的类的对象是否占用内存?

c++ - MailSlot写发送同样的东西三次C/C++

无法通过邮槽发送 wchar_t 数组

c++ - 新对象中的空函数指针实际上不是 nullptr

c++ - 不同IPC机制的使用

c++ - 使用互斥量调节两个进程之间的 IPC

c++ - 将转发 lambda 转换为函数指针