无法通过系统注册表中的递归打印子项的子项
Unable to print Subkeys of the subkeys through recursion in the System Registry
我正在尝试为HIVE中的键查找子键的子键。下面发布的是我的代码我可以获得注册表中的所有子项。但是,我无法在注册表中获取子项的子项。我写了一个递归代码来做到这一点!然而,它并没有给我任何输出!如有任何帮助,我们将不胜感激!
#include <stdio.h>
#include <windows.h>
#include <tchar.h>
#define MAX_KEY_LENGTH 255
#define MAX_VALUE_NAME 16383
void QueryKey(HKEY hkey)
{
TCHAR achKey[MAX_KEY_LENGTH];
DWORD cbName;
TCHAR achClass[MAX_PATH] = TEXT("");
DWORD cchClassName = MAX_PATH;
LPBYTE data = (LPBYTE)malloc(512);
DWORD cSubKeys=0;
DWORD dataType,cbMaxSubKey,cchMaxClass,cValues,retcode2,valueType,dataSize;
long lResult;
DWORD cchMaxValue,cbMaxValueData;
int y;
DWORD cbSecurityDescriptor;
char buffer[255]= {0};
DWORD dwbuffersize = sizeof(buffer);
FILETIME ftLastWriteTime;
DWORD i, retCode,retCode2;
TCHAR achValue[MAX_VALUE_NAME];
DWORD cchValue = MAX_VALUE_NAME;
retCode = RegQueryInfoKey(hkey,
(LPWSTR)achClass, &cchClassName,NULL, &cSubKeys,&cbMaxSubKey, &cchMaxClass,
&cValues,&cchMaxValue, &cbMaxValueData, &cbSecurityDescriptor,
&ftLastWriteTime);
if(cSubKeys)
{
printf("n Subkey Names:");
for(i=0; i<cSubKeys; i++)
{
cbName = MAX_KEY_LENGTH;
retCode = RegEnumKeyEx(hkey, i,(LPWSTR)achKey,&cbName,
NULL,NULL,NULL,&ftLastWriteTime);
if(retCode == ERROR_SUCCESS)
{
printf("n(%d) %S", i+1, achKey);
QueryKey((HKEY)subkey);
}
}
printf("n Number of subkeys: %dnn", cSubKeys);
}
else
printf("n there is no subkey");
if (cValues)
{
printf( "nNumber of values: %dn", cValues);
for (i=0, retCode=ERROR_SUCCESS; i<cValues; i++)
{
cchValue = MAX_VALUE_NAME;
achValue[0] = ' ';
retCode2 = RegEnumValue(hkey, i, achValue, &cchValue, NULL,
&dataType, data, &dataSize);
if(retCode2==ERROR_SUCCESS)
printf("n%u",&dataType);
else
printf("no");
if (retCode == ERROR_SUCCESS )
_tprintf(TEXT("n(%d) %s"), i+1,achValue);
}
}
else
printf("bye");
}
int main(int argc , char *argv[])
{
HKEY hTestKey;
TCHAR buffer[260];
DWORD bufferSize = sizeof(buffer);
if(RegOpenKeyEx( HKEY_LOCAL_MACHINE, NULL, 0, KEY_READ, &hTestKey) == ERROR_SUCCESS)
{
printf("n-------Registry Information----------");
printf("n HIVE_NAME : HKEY_LOCAL_MACHINE");
QueryKey(hTestKey);
}
else
printf("bye");
RegCloseKey(hTestKey);
return 0;
}
不能只将子键的字符串名称传递给HKEY
到QueryKey
。你需要通过一个实际的HKEY
,你可以通过打开密钥获得:
HKEY subkey;
LONG r = RegOpenKeyEx(hkey, achKey, 0, KEY_ALL_ACCESS, &subkey);
if (r == ERROR_SUCCESS) {
QueryKey(subkey);
RegCloseKey(subkey);
}
试试类似的东西:
#ifdef UNICODE
#define TCHAR_FMT "%S"
#else
#define TCHAR_FMT "%s"
#endif
typedef std::basic_string<TCHAR> tstring;
void QueryKey(HKEY hkey, const tstring &keyPath)
{
TCHAR achKey[MAX_KEY_LENGTH];
DWORD cbName;
TCHAR achClass[MAX_PATH] = {0};
DWORD cchClassName = MAX_PATH;
DWORD cSubKeys = 0;
DWORD dataType, cbMaxSubKey, cchMaxClass, cValues, valueType, dataSize;
long lResult;
DWORD cchMaxValue, cbMaxValueData;
DWORD cbSecurityDescriptor;
FILETIME ftLastWriteTime;
DWORD i;
TCHAR achValue[MAX_VALUE_NAME];
DWORD cchValue = MAX_VALUE_NAME;
HKEY hTmpKey;
lResult = RegQueryInfoKey(hkey,
achClass, &cchClassName, NULL, &cSubKeys, &cbMaxSubKey, &cchMaxClass,
&cValues, &cchMaxValue, &cbMaxValueData, &cbSecurityDescriptor,
&ftLastWriteTime);
if (lResult != ERROR_SUCCESS)
{
printf("n cannot query key: " TCHAR_FMT ", error %d", keyPath.c_str(), lResult);
return;
}
if (cSubKeys)
{
printf("n Number of subkeys: %u", cSubKeys);
printf("n Subkey Names:");
for(i = 0; i < cSubKeys; ++i)
{
cbName = MAX_KEY_LENGTH;
lResult = RegEnumKeyEx(hkey, i, achKey, &cbName,
NULL, NULL, NULL, &ftLastWriteTime);
if (lResult == ERROR_SUCCESS)
{
achKey[cbName] = 0;
printf("n(%u) " TCHAR_FMT, i+1, achKey);
tstring subkeyPath = keyPath + TEXT("\") + achKey;
lResult = RegOpenKeyEx(hKey, achKey, 0, KEY_READ, &hTmpKey);
if (lResult == ERROR_SUCCESS)
{
QueryKey(hTmpKey, subkeyPath);
RegCloseKey(hTmpKey);
}
else
printf("n cannot open subkey: " TCHAR_FMT ", error %d", subkeyPath.c_str(), lResult);
}
else
printf("n cannot query subkey name, error %d", lResult);
}
}
else
printf("n there is no subkey");
if (cValues)
{
printf( "nNumber of values: %un", cValues);
for (i = 0, i < cValues; ++i)
{
cchValue = MAX_VALUE_NAME;
lResult = RegEnumValue(hkey, i, achValue, &cchValue, NULL,
&dataType, data, &dataSize);
if (lResult == ERROR_SUCCESS)
{
achValue[cchValue] = 0;
printf("n (%d) %u: " TCHAR_FMT, i+1, dataType, achValue);
}
else
printf("n cannot query value name, error %d", lResult);
}
}
else
printf("n there is no value");
}
int main(int argc, char *argv[])
{
HKEY hTestKey;
printf("n-------Registry Information----------");
printf("n HIVE_NAME : HKEY_LOCAL_MACHINE");
if (RegOpenKeyEx( HKEY_LOCAL_MACHINE, NULL, 0, KEY_READ, &hTestKey) == ERROR_SUCCESS)
{
QueryKey(hTestKey, TEXT("\"));
RegCloseKey(hTestKey);
}
else
printf("n cannot open hive, error %d", lResult);
return 0;
}
相关文章:
- 如何使用递归打印修改后的星号三角形图案
- 使用递归 c++ 打印模式
- 使用类进行实现时,递归打印C++中的链表
- 如何使用递归打印最长公共子序列中涉及的字符串?
- 使用递归打印所有递增子序列
- 二叉搜索树按级别递归C++打印节点
- 使用递归打印输出
- 如何使用递归打印文本反驳
- 使用while和if递归打印字符
- 将数组传递到空隙函数,然后递归打印元素
- 在 C++ 中使用递归打印斐波那契级数
- 如何使用字符串流C++递归打印出二进制搜索树中的所有节点
- IntStack的C++递归打印函数
- 使用C++第2部分递归打印LinkedList
- 使用C++递归打印LinkedList
- C++如何递归打印阶乘程序的输出
- 如何使用类链表进行递归打印
- 使用斐波那契递归打印 1 到 n
- 使用单个参数递归打印菱形
- 使用递归C++打印等边三角形A-Z