我有以下代码:
#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 )。
发布于 2013-10-09 09:03:16
您没有为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_DWORD
、REG_SZ
等,并且从RegEnumValue()
返回的数据是原始数据。RegEnumValue()
还可以返回一个指示数据类型的值,如果您要正确地解释它,您绝对需要检查这一点。
发布于 2021-07-05 00:42:31
更改代码以将字符串值转换为lpData:
#define MAX_DATA_LENGTH 16383
char* lpData = new char[MAX_DATA_LENGTH];
DWORD lpDataLength = MAX_DATA_LENGTH;
RegEnumValue(phkResult, dwIndex, lpValueName, &lpcchValueName, NULL, NULL, (unsigned char*)lpData, &lpDataLength);
https://stackoverflow.com/questions/19261113
复制相似问题