我试图使用RegQueryInfoKey
来获取最长值和数据大小,然后使用RegEnumValue
来显示所有值,但是我得到了234个错误值,这意味着当我运行应用程序时“有更多数据可用”。
我还使用malloc
来分配lpValueName
和lpData
以便使用RegQueryInfoKey
给我的大小。
例如,如果我将lpcchValueName
设置为16383,这个应用程序运行得很好,但它不知道为什么它没有使用lpcMaxSubKeyLen
返回的RegQueryInfoKey
值。
注册表项有两个字符串值:
我做错什么了?为你可能看到的所有错误道歉。这是我的代码:
int wmain()
{
//RegOpenKeyEx
HKEY hKey = HKEY_CURRENT_USER;
LPCWSTR subKey = L"WinSide";
DWORD options = 0;
REGSAM samDesired = KEY_QUERY_VALUE;
HKEY hkOpenResult;
//Opening the HKEY_CURRENT_USER\WinSide subkey
LONG openKey = RegOpenKeyEx(hKey, subKey, options,
samDesired, &hkOpenResult);
if (openKey != ERROR_SUCCESS)
wprintf(L"Error code: %li\n", openKey);
else
{
wprintf(L"Key opened!\n");
//RegQueryInfoKey
LPWSTR pClass = NULL;
LPDWORD pcClass = NULL;
LPDWORD reserved = NULL;
DWORD numberOfSubKeys;
LPDWORD pcMaxSubKeyLen = NULL;
LPDWORD pcMaxClassLen = NULL;
DWORD numberOfValues;
DWORD longestValueName;
DWORD longestDataComponent;
LPDWORD securityDescriptor = NULL;
PFILETIME pLastWriteTime = NULL;
//Querying info from HKCU\WinSide subkey
LONG queryInfo = RegQueryInfoKey(hkOpenResult, pClass, pcClass, reserved, &numberOfSubKeys,
pcMaxSubKeyLen, pcMaxClassLen, &numberOfValues,
&longestValueName, &longestDataComponent,
securityDescriptor, pLastWriteTime);
if (queryInfo != ERROR_SUCCESS)
wprintf(L"Error code: %li\n", queryInfo);
else
{
wprintf(L"Key queried!\n");
wprintf(L"Number of values: %u\n", numberOfValues);
//RegEnumValue
DWORD index=0;
DWORD sizedem = sizeof(WCHAR);
LPWSTR nameOfValue = (LPWSTR)malloc(longestValueName * sizeof(WCHAR));
DWORD sizeOfBufffer = longestValueName;
DWORD typeOfDataStored;
LPBYTE pData = (LPBYTE)malloc(longestDataComponent * sizeof(BYTE));
DWORD sizeOfData = longestDataComponent;
if (nameOfValue != NULL && pData != NULL)
{
for (index = 0; index < numberOfValues; index++)
{
sizeOfBufffer = longestValueName;
//Enumerating values from HKCU\WinSide subkey
LONG enuValue = RegEnumValue(hkOpenResult, index, nameOfValue,
&sizeOfBufffer, NULL, &typeOfDataStored,
pData, &sizeOfData);
if (enuValue != ERROR_SUCCESS)
wprintf(L"Error code: %li\n", enuValue);
else
{
wprintf(L"Value: %s\n", (LPWSTR)pData);
}
}
}
else
{
wprintf(L"Memory could not be allocated.\n");
}
free(nameOfValue);
free(pData);
}
RegCloseKey(hkOpenResult);
}
return 0;
}
这是我的结果:
谢谢!
最佳答案
您的代码包含许多错误。
(一)LPWSTR nameOfValue = (LPWSTR)malloc(longestValueName * sizeof(WCHAR));
真的很长这个是
大小不包括终止的空字符。
所以你需要
LPWSTR nameOfValue = (LPWSTR)malloc((longestValueName + 1) * sizeof(WCHAR));
或者(更好)
LPWSTR nameOfValue = (LPWSTR)malloc(++longestValueName * sizeof(WCHAR));
然后在循环中,如果使用第一个变量-
sizeOfBufffer = longestValueName + 1
;或者在代码中,如果使用
++longestValueName
2)
DWORD sizeOfData = longestDataComponent;
您必须在循环中执行此操作,as和
sizeOfBufffer = longestValueName
;因为sizeOfData
将在每个RegEnumValue
3)你必须准备好,直到你枚举密钥,有人可以改变关键数据/价值-所以最大可以增加-你得到的调用
RegQueryInfoKey
只是合理的提示,但不是100%保证。关于c - 错误234,具有RegQueryInfoKey和RegEnumValue的更多数据可用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39111074/