Eigener Registry editor ?!?
-
Hi,
Bin dabei nen eigenen Registry editor zu coden, hab aber keinen plan wie ich mir zb die unterkeys von einem key oder die werte darin aufliste. Es muss doch irgendeine möglichkeit geben das in nen array oder so zu speichern und dann anzuzeigen. Ich kann in meinem Dialogfeld ne Stuktur ansicht hinzufügen, weiss aber net wie ich die keys und die Werte aus der registry jetzt da rein bekomme, plz help , thx
-
Grob zusammengefasst, Du fängst ganz von vorne an. Dazu gibts tolle MFC-Tutorials. Links sind auch hier zu finden.
-
Nicht wirklich, bin schon gut C erfahren und hab mit c++ schon nen kleines chat tool über netzwerk gemacht. Also das ist nich das problem, ich weiss nur die funktionen für das auflisten von registry keys net und auch net die funktion von diesem steuerelement des verzeichnisbaums die ich dazu brauche
-
versuchs mal mit
RegEnumKeyEx(...)
und
RegEnumValue(...)[edit]
kleines beispiel:void EnumRegistryKeys(HKEY hkRootKey, CString cstrKeyFolder, CStringArray *pArray) { if( pArray == NULL ) return; HKEY hkFolder; LONG nResult = RegOpenKeyEx( hkRootKey, cstrKeyFolder, 0,KEY_READ, &hkFolder); if( nResult == ERROR_SUCCESS ){ DWORD dwIndex = 0; DWORD dwSize = 256; CString cstrName; CString cstrClass; while( RegEnumKeyEx(hkFolder, dwIndex, cstrName.GetBuffer(256), &dwSize, 0, cstrClass.GetBuffer(256), &dwSize, NULL ) != ERROR_NO_MORE_ITEMS ){ cstrClass.ReleaseBuffer(); cstrName.ReleaseBuffer(); dwIndex++; dwSize = 256; pArray->Add( cstrName ); } RegCloseKey(hkRootKey); } }
[/edit]
grüsse
[ Dieser Beitrag wurde am 14.03.2003 um 17:48 Uhr von soUrcerer editiert. ]
[ Dieser Beitrag wurde am 14.03.2003 um 17:50 Uhr von soUrcerer editiert. ]
-
Erstmal danke für diese funktion, die ist echt spitze und gut nachvollziehbar.
Aber jedes mal wenn ich die ausführen will sagt der mir folgendes:error C2660: 'EnumRegistryKeys' : Funktion akzeptiert keine 3 Parameter
Ich führe die funktion folgerndermaßen aus:
EnumRegistryKeys(HKEY_LOCAL_MACHINE, "software", RegFolder);
Regfolder is mein array, den ich auch in der .h datei deklariert hab.
mfg 5kYw4lKeR
-
komisch ... der fehler ... die funktion hat ja 3 parameter definiert ...
Hast du denn auch nen pointer auf das array (CStringArray) an die funktion übergeben, oder das objekt selbst?
Vielleicht hilft schon
EnumRegistryKeys(HKEY_LOCAL_MACHINE, "software", &RegFolder);
-
-
Hmm, was meinst du mit pointer?
Mein Array is folgendermaßen deklariert:
CStringArray RegFolder;
Den Array hab ich als public variable in die .h aufgenommen, mehr brauch ich doch normal nicht, oder?
mfg 5kYw4lKeR
-
Original erstellt von 5kYw4lKeR:
... bin schon gut C erfahren ...hm, noch nie den begriff pointer gehört? sagt dir zeiger vielleicht was?
falls nicht rate ich dir wirklich dringend erstmal deine c/c++ kenntnisse aufzupolieren... pointer sollte man schon kennen bevor man sich an ein RegEdit ranwagt. meine meinung...aber bei deinem problem wird die zeile
EnumRegistryKeys(HKEY_LOCAL_MACHINE, "software", &RegFolder);
NICHT
EnumRegistryKeys(HKEY_LOCAL_MACHINE, "software", RegFolder); !!!schon helfen, denke ich.
-
Nee, das hilft leider nix, hab den selben error wieder.
Aber warum?Die funktion besitzt 3 parameter und die habe ich alle angegeben.
Bin ziemlich ratlos, das kann doch normal garnicht sein. Wenn ich statt dem array irgendnen scheiss eingebe kommt ne andere fehlermeldung, nämlich das diese variable nicht definiert sei, also ist mein Array vollkommen in ordnung.Nen Pointer brauch ich doch hier garnich wenn ich die variable in die header datei schreibe, dann ist sie doch überall im code verfügbar oder lieg ich da falsch?
Mfg 5kYw4lKeR
-
Guck mal in die MFC-FAQ, da hats nen Registry-Beitrag, alternativ auch die WinAPI-FAQ, da hats nen Beitrag von mir.
-
Jo, thx deus, aber das hilft mir im moment nicht sehr viel weiter, mich interressiert eher warum die funktion sich nicht aufrufen lässt.
Aber trotzdem nochma danke. Die andern befehle werd ich auch noch brauchen, aber dazu später...
mfg 5kYw4lKeR
[ Dieser Beitrag wurde am 15.03.2003 um 11:23 Uhr von 5kYw4lKeR editiert. ]
-
Original erstellt von 5kYw4lKeR:
**Hmm, was meinst du mit pointer?Mein Array is folgendermaßen deklariert:
CStringArray RegFolder;
Den Array hab ich als public variable in die .h aufgenommen, mehr brauch ich doch normal nicht, oder?
mfg 5kYw4lKeR**
Hab' auch net wirklich den Peil, is' alles noch sehr wacklig.
Aber muß es nichtCStringArray* RegFolder;
heissen?!?
MfG, Sarge
-
ohje ...
nein ... es sollte nicht
CStringArray* RegFolder;
heissen, es sei denn, du legst dann auch ein entsprechendes Object mit new an und löscht es dann wieder mit delete.Also das die Meldung mit den 3 Parametern kommt kann ich auchnicht nachvollziehen.
Also so stell ich mir das mal vor:
DeineKlasse.h
#include "winreg.h" // linken mit advapi32.lib ... public: void EnumRegistryKeys(HKEY hkRootKey, CString cstrKeyFolder, CStringArray *pArray); private: CStringArray RegFolder; ...
DeineKlasse.cpp
... void DeineKlasse::EnumRegistryKeys(HKEY hkRootKey, CString cstrKeyFolder, CStringArray *pArray) { // inhalt der funktion } void DeineKlasse::IrgendeineAndereFunktion() { EnumRegistryKeys(HKEY_LOCAL_MACHINE, "software", &RegFolder); // so, ab hier sollte RegFolder gefüllt sein. } ...
Das sollte so eigentlich laufen!
Und wenn nicht, häng dich doch nicht an dem schei** array auf ... du willst doch nur die registry keys wissen ... schreib dir die funktion halt um.
Ansonsten Poste mal ein bischen code, damit wir wissen um was es geht.
grüsse
-
An den Zauberer:
Okay. Hab's jetzt auch selber rausgefunden. Von Java auf C++ war das so 'ne Sache...Wenn ich CStringArray* RegFolder = new RegFolder(bla); mache lösche ich das Ding nach Gebrauch mit delete RegFolder; ja?! (Destruktor)
Bei CStringArray RegFolder; wird automatisch der (Standard-)Konstruktor aufgerufen, ja!? Wie rufe ich den Destruktor davon denn nun auf? Ohne new kein delete, oder!?Thx, Sarge
P.S.: Ich frage das hier direkt den soUrcerer, weil mich das nur am Rande interessiert und ich dafür kein' eigenen Thread aufmachen will. Also keine Flamez plz.
P.P.S.: Es gibt in C++ ja auch Referenzen. Sind die genauso einzusetzen wie Ref. in Java? Also ein kompletter Ersatz für Zeigeroperationen!?!Danke.
Sarge->Ende();
-
Du liegst völlig richtig soUrcerer, hab meinen code genauso aufgebaut wie du es oben beschrieben hast. Ich werde nochn bisl an der funktion rumbasteln, vielleicht find ich's ja irgendwie noch raus oder mach irgendwas anderes.
Falls noch irgendeiner ne idee zum "...3 Parameter..." hat würde mich das freuen!
Mfg 5kYw4lKeR
-
Doh !!!
Ich DeppDie funktion in meiner cpp hat natürlich 3parameter , aber in meiner .h datei hab ich keine parameter dran gehängt ich depp!!!
Hatte da nur drin stehn :void EnumRegistryKeys();
Aber jetz hab ich nen zweites problem, da isn unaufglöster externer Verweis:
SkyNetDlg.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: void __thiscall CSkyNetDlg::EnumRegistryKeys(struct HKEY__ *,class CString,class CStringArray *)" (?EnumRegistryKeys@CSkyNetDlg@@QAEXPAUHKEY__@@VCString@@PAVCStringArray@@@Z) Release/SkyNet.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise
PS: SkyNet , so heisst mein projekt
-
@Sgt. Nukem
Wenn du Objekte mit new anlegst, wird an dieser stelle der konstruktor aufgerufen. Wenn du dann irgendwann delete machst, wird der destruktor ausgeführt.
Bei Objekten, die innerhalb von klassen definiert sind, wird der konstruktor ausgeführt, wenn der konstruktor der klasse ausgeführt wird ... analog dazu der destruktor.
Allgemein gilt: nach ablauf der lebensdauer eines objekts wird sein destruktor aufgerufen.Und ja, es gibt auch referenzen.
Diese werden mit einem & markiert. z.b.
void TuWas(CStringArray& array) { // array ist zu benutzen wie ein Objekt, nicht wie ein Zieger. array.Add("test"); ... } CStringArray csaArray; TuWas( csaArray ); // nicht &csaArray
überprüf nochmal, ob in beiden dateien die Funktionen exact die gleichen Parameter haben. Wichtig ist auch, das du die Angabe der Klasse bei der Funktion nicht vergisst:
void CSkyNetDlg::EnumRegistryKeys(HKEY hkRootKey, CString cstrKeyFolder, CStringArray *pArray) { ... }
und nicht
void EnumRegistryKeys(HKEY hkRootKey, CString cstrKeyFolder, CStringArray *pArray) { ... }
Wenn das alles passt, bereinige mal dein Projekt, also lösche alle vom compiler erstellten dateien (im debug/release ordner), oder wähle "Bereinigen" aus dem VC++ Menu. Das kann unter umständen auch helfen.
grüsse
[ Dieser Beitrag wurde am 16.03.2003 um 13:33 Uhr von soUrcerer editiert. ]
-
Big thx 2 all, habt mir echt geholfen, ich kann jetz schön die registry auslesen und auch mit...:
m_ctlRegTree.InsertItem(cstrName,NULL,NULL,TVI_ROOT,TVI_LAST);
...Etwas hinzufügen, das problem ist nur, wie kann ich etwas wieder "unterverzeichnisse" davon machen, ich brauch dazu den string von dem objekt worauf ich geklickt habe, aber an den komme ich irgendwie nich ran.
Die funktion wenn man auf ein Objekt klickt hab ich schon gefunden, sie lautet:
OnSelchangingRegTree(NMHDR* pNMHDR, LRESULT* pResult)
Aber woher bekomm ich jetzt worauf ich geklickt habe???
Dann kann ich nämlich einfach den alten path mit dem neuen verzeichnis zusammenfügen und die funktion wieder mit dem neuen verzeichnis zum auslesen ausführen.mfg 5kYw4lKeR
PS: RegTree ist mein Steurerelement mit der Baum Ansicht
Update:
Hab noch was gefunden:
"m_ctlRegTree.GetSelectedItem()" gibt mir den handle von dem aktuellen selektierten item in der baumansicht zurück, kann mir mal jemand sagen wie ich aus diesem handle dann den string bekomme?[ Dieser Beitrag wurde am 16.03.2003 um 23:12 Uhr von 5kYw4lKeR editiert. ]
-
Ok, ich habs jetzt:
m_ctlRegTree.GetItemText(m_ctlRegTree.GetSelectedItem());
mfg 5kYw4lKeR