How I can get a branch of registry recursively in builder c++?
Please, help anyone! I don't understand, how i could give a variable H_KEY type, it's want UnicodeString!
TRegistry *reg = new TRegistry(KEY_ALL_ACCESS);
reg->RootKey=HKEY_LOCAL_MACHINE;
reg->OpenKey("",0); //Открываем ключ
TStringList *s=new TStringList;
reg->GetValueNames(s); // список параметров
// ShowMessage(s->Text);
for(int znach=0; znach<s->Count; znach++)
{
String a=s->Strings[znach];
if(a=="Path" || a=="Directory")
{
ShowMessage("Parameter detected");
// где-то тут функцию для проверки на существование в файловой системе
}
// else ShowMessage("Проверять нечего. Следующий параметр");
}
if(reg->HasSubKeys()==true)
{
TStringList *l=new TStringList;
reg->GetKeyNames(l); // список подключей
ListBox1->Items->AddStrings(l);
for(int ik=0;ik<l->Count;ik++) // каждый подключ
{
TRegistry *reg1 = new TRegistry(KEY_ALL_ACCESS);
TStringList *lol=new TStringList;
reg1->RootKey=reg->RootKey;
//reg1->OpenKey("",1);
reg1->OpenKey(UnicodeString(l->Strings[ik]), 1);
if(reg1->HasSubKeys()==true) // если есть подключи
{
reg1->GetKeyNames(lol);
// ListBox1->Items->Add("_______________"+UnicodeString(l->Strings[ik])+"_____________________");
ListBox1->Items->Add("_______________");
if(lol->Count>0)
{
for(int l1=0; l1<lol->Count; l1++)
{
ListBox1->Items->AddStrings(lol); // добавляем все подключи
reg1->OpenKey(UnicodeString(lol->Strings[l1]),0);
// reg1->OpenKey("",1); // открываем текущий ключ
TStringList *l1=new TStringList;
reg1->GetValueNames(l1); // получаем список параметров
if(l1->Count>0)
{
// for(int kr=0;kr<l1->Count;kr++) // перебирается список параметров
// {
// String zeze=reg1->ReadString(l1->ValueFromIndex[kr]);
// ListBox1->Items->Add("_______________"+zeze+"_____________________");
// // ListBox1->Items->AddStrings(l1); //добавляются все параметры подключа
// 开发者_运维问答 }
// // ShowMessage(l1->Count);
// for(int k=0; k<s->Count; k++)
{
UnicodeString a=reg->ReadString("Path");
UnicodeString b=reg->ReadString("Directory");
}
}
} reg1->CloseKey();
}
}
}
delete reg;
}
I've solved my problem. You can see code here:
void Recurse(UnicodeString currentpath)
{
// HKEY all[]={HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_CURRENT_CONFIG};
TRegistry *reg=new TRegistry(KEY_ALL_ACCESS);
TStringList *l=new TStringList;
TStringList *s=new TStringList;
TStringList *k=new TStringList;
TStringList *k1=new TStringList;
reg->RootKey=HKEY_LOCAL_MACHINE;
UnicodeString bl=currentpath+"\\";
reg->OpenKey(currentpath,0);
reg->GetKeyNames(l);
// Form1->ListBox1->Items->AddStrings(l);
reg->GetValueNames(s);
if(reg->HasSubKeys()==true || s>0)
{
for(int v=0;v<l->Count;v++)
{
reg->OpenKey(bl+l->Strings[v],0); //"\\"
reg->GetKeyNames(k);
for(int t=0; t<k->Count; t++)
{
reg->GetValueNames(k1);
for(int ze=0;ze<k1->Count;ze++)
{
if(reg->ValueExists("Path")|| reg->ValueExists("Directory")|| reg->ValueExists("path")|| reg->ValueExists("directory"))
{
String a=reg->ReadString("Path");
Form1->ListBox1->Items->Add(bl+l->Strings[v]+"\\"+k->Strings[t]+"\\"+k1->Strings[ze]+
" "+a);
Form1->Memo1->Lines->Add(a);
n++;
}
}
}
if(reg->HasSubKeys()==true)
{
Recurse(bl+l->Strings[v]);
reg->CloseKey();
}
}
}
else ShowMessage("That's all");
}
精彩评论