[TRegistry] Ganzen Ordner auslesen
-
Jop, zu dierser Erkenntnis bin ich dann auch gelangt *g*
Mein Problem ist es nur dass ich die name aller Schlüssel direkt unter dem Rootkey bräuchte, ich da allerding noch nicht rankomme.
Edit: habs bei openkey "\\" übergeben.
lg
-
Ich mache diesen Doppelpost damit man die aktualisierung sieht:
Also folgenden Code hab ich nun:
void TForm1::Extrahieren() { searchReg("Blind Access"); } //--------------------------------------------------------------------------- void TForm1::anzeigen(AnsiString a) { ListBox->AddItem("[" + Time() + "] " + a,NULL); } //--------------------------------------------------------------------------- std::vector<AnsiString>* TForm1::searchReg(AnsiString w) { TRegistry& myReg = *new TRegistry(); std::vector<AnsiString> results; //1. HKEY_CURRENT_USER searchReg_Rek(HKEY_CURRENT_USER,w,&results,"\\"); //Registry schliessen myReg.CloseKey(); //Objekt löschen delete &myReg; //Fund ausgeben for( int i = 0; i < results.capacity(); i ++ ) { anzeigen("Ergebnis:" + results.operator [](i)); } } //--------------------------------------------------------------------------- void TForm1::searchReg_Rek(void *HKEY, AnsiString w,std::vector<AnsiString> *results,AnsiString ordner) { TRegistry& myReg = *new TRegistry(); myReg.RootKey = HKEY; myReg.OpenKey(ordner,false); TStringList *res_t = new TStringList(); myReg.GetKeyNames(res_t); for( int i = 0; i < res_t->Count; i ++ ) { Application->ProcessMessages(); if( res_t->operator [](i) == w ){ results->push_back(res_t->operator [](i)); } else{ searchReg_Rek(HKEY,w,results,ordner + "\\" + res_t->operator [](i)); } //???!!!! } //Registry schliessen myReg.CloseKey(); //Objekt löschen delete &myReg; } //---------------------------------------------------------------------------
Bis zu einer gewissen Tiefe kommt der Algorithmus, aber bei einer bestimmten eben nicht, wo könnte der Fehler liegen?
-
Bei deinem Code ist ja einiges falsch. Ich habe erstmal die offensichtlichen Sachen geändert. Vielleicht bekommst du den Rest selber hin.
Wurde dein Code überhaupt compiliert?
-
Wo hast du was geändert? Ich sehe nichts
Wieso sollte er nicht compiliert werden?
-
Ups
Da habe ich doch glatt vergessen den Code hier reinzustellen.std::vector<AnsiString> TForm1::searchReg(AnsiString w) { TRegistry* myReg = new TRegistry(); // myReg sollte ein Pointer sein std::vector<AnsiString> results; //1. HKEY_CURRENT_USER searchReg_Rek(HKEY_CURRENT_USER,w, results,"\\"); // Übergabe result als Referenz //Registry schliessen myReg->CloseKey(); // Pointer //Objekt löschen delete myReg; //Fund ausgeben for( int i = 0; i < results.size(); i ++ ) // size enthält die Anzahl der Elemente im vector und nicht capacity { anzeigen("Ergebnis:" + results[i]); // Der Operatorsyntax ist hier nicht nötig } return results; // die Funktion sollte auch was zurückgeben, dies könnte man aber besser als Referenzparameter machen } //--------------------------------------------------------------------------- void TForm1::searchReg_Rek(void *HKEY, const AnsiString& w, std::vector<AnsiString>& results, const AnsiString& ordner) //vector-Übergabe als Referenz { TRegistry* myReg = new TRegistry(); // myReg sollte ein Pointer sein myReg->RootKey = HKEY; myReg->OpenKey(ordner,false); TStringList *res_t = new TStringList(); myReg->GetKeyNames(res_t); for( int i = 0; i < res_t->Count; i ++ ) { // Application->ProcessMessages(); //wozu das hier? if( res_t->Strings[i] == w ) // Strings[] enthält die Elemente einer StringList { results->push_back(res_t->Strings[i]); // dito } else { searchReg_Rek(HKEY,w,results,ordner + "\\" + res_t->Strings[i]); // was ist w? } //???!!!! } //Registry schliessen myReg->CloseKey(); //Objekt löschen delete res_t; // Stringlist sollte auch gelöscht werden delete myReg; } //---------------------------------------------------------------------------
Das TStringList einen operator[] hat war mir neu.
-
hehe ^^
DankeFunktioniert allerdings genauso gut wie vorher, bis zu einem gewissen Grad findet er den Key (hier: w), allerdings in tieferen Bäumen nicht mehr :|
-
Evtl. solltest du das TRegistry-Objekt nur einmal öffnen (in searchReg) und dann den Pointer an searchReg_Rek übergeben. Evtl. gibt es ja Probleme mit zu vielen offenen TRegistry-Instanzen.
-
Gut möglich, aber da ja ein rekursiver aufruf stattfindet ist ja jedesmal per OpenKey ein Key angegeben, wodurch ich ja dann wuasi auf frühere Keys nicht mehr zurückgreifen kann um von dort aus weiter zu suchen .
-
Wo ist da das Problem? Du hast deinen Key doch schon durchsucht und die Ergebnisse in der Stringlist. Wenn es nötig sein sollte, kannst du doch den Schlüssel mit OpenKey jederzeit neu öffnen.
-
Hast recht
Aber er kommt dennoch nicht tiefer ...
std::vector<AnsiString> TForm1::searchReg(AnsiString w) { TRegistry *myReg = new TRegistry(); // myReg sollte ein Pointer sein std::vector<AnsiString> results; //1. HKEY_CURRENT_USER myReg->RootKey = HKEY_CURRENT_USER; searchReg_Rek(*myReg,w, results,"\\"); // Übergabe result als Referenz //Registry schliessen myReg->CloseKey(); // Pointer //Objekt löschen delete myReg; //Fund ausgeben for( int i = 0; i < results.size(); i ++ ) // size enthält die Anzahl der Elemente im vector und nicht capacity { anzeigen("Ergebnis:" + results[i]); // Der Operatorsyntax ist hier nicht nötig } return results; // die Funktion sollte auch was zurückgeben, dies könnte man aber besser als Referenzparameter machen } //--------------------------------------------------------------------------- void TForm1::searchReg_Rek(TRegistry& myReg, const AnsiString& w, std::vector<AnsiString>& results, const AnsiString& ordner) //vector-Übergabe als Referenz { myReg.OpenKey(ordner,false); TStringList *res_t = new TStringList(); myReg.GetKeyNames(res_t); for( int i = 0; i < res_t->Count; i ++ ) { Application->ProcessMessages(); if( res_t->Strings[i] == w ) // Strings[] enthält die Elemente einer StringList { results.push_back(res_t->Strings[i]); // dito } else { searchReg_Rek(myReg,w,results,res_t->Strings[i]); } } //Objekt löschen delete res_t; } //---------------------------------------------------------------------------
EDIT: Es scheint an myReg.GetKeyNames(res_t); zu liegen, da dort immernur quasi der 'ordner' abgespeichert wird , x-fach
-
Kontrolliere doch mal den Rückgabewert von OpenKey, ob der Schlüssel überhaupt geöffnet werden konnte. Geh auch mal mit dem Debugger durch und schau was in Ordner überhaupt drin steht.
-
Ok, das Array und die Infos darin scheinen doch okay zu sein, allerdings bleibt er nur im Baum des ersten Ordners, er scheint eigentlich immer im 1. Ordner zu bleiben...