Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

  • »MuesliSchuessel« ist der Autor dieses Themas

Beiträge: 25

Beruf: Schüler

  • Private Nachricht senden

1

07.03.2013, 08:33

Key aus Registry löschen [C++]

Moin.
Ich hab mir ne Art Texteditor geschrieben und der verwendet ein eigenes Dateiformat.
Das hab ich dann mit dem Programm in Registry verknüpft,damit ich die Datein leichter öffnen kann.
Meine Frage ist jetz :
Wie kann ich den wieder löschen ?
Mein bisheriger Versuch funktioniert nicht,auch nicht mit Admin-Rechten. Ich weiß grad echt nicht was ich da falsch gemacht hab o.O

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//Methode zum löschen des Keys 
int ret = 0; 
string ext = ".te"; 
string desc = ""; 
string sub ="\\shell\\"; 
string action = "Open TE"; 
string app = exepath+" %1"; 
string path = ext+sub+action+"\\command\\"; 
HKEY hKey = {0}; 
string s = path+app; 
if(RegOpenKeyEx(HKEY_CLASSES_ROOT,s.c_str(),0,KEY_ALL_ACCESS,&hKey) != ERROR_SUCCESS) 
ret = 1; 
if(RegDeleteKeyEx(hKey,s.c_str(),KEY_WOW64_64KEY,0) != ERROR_SUCCESS) 
ret = 2; 
RegCloseKey(hKey);


Kann mir da jemand nen Tipp oder so geben ?

lg

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

07.03.2013, 08:45

Was genau funktioniert nicht? Wie sehen die Rückgabewerte der Funktionsaufrufe da aus?

  • »MuesliSchuessel« ist der Autor dieses Themas

Beiträge: 25

Beruf: Schüler

  • Private Nachricht senden

3

07.03.2013, 16:35

Mir ist da n kleiner Fehler aufgefallen (ich glaub zu mindestens ,dass es einer ist)
Und zwar müsste es RegOpenKeyEx path.c_str() und nicht s.c_str() sein ( app ist ja der Wert ,den der Pfad im String path hat ,falls man das so nennt).
Sieht also so aus :

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int ret = 0; 
string ext = ".te"; 
string desc = ""; 
string sub ="\\shell\\"; 
string action = "Open TE"; 
string app = exepath+" %1"; 
string path = ext+sub+action+"\\command\\"; 
HKEY hKey = {0}; 
string s = path+app; 
if(RegOpenKeyEx(HKEY_CLASSES_ROOT,path.c_str(),0,KEY_ALL_ACCESS,&hKey) != ERROR_SUCCESS) 
ret = 1; 
if(RegDeleteKeyEx(hKey,s.c_str(),KEY_WOW64_64KEY,0) != ERROR_SUCCESS) 
ret = 2; 
RegCloseKey(hKey);

RegOpenKeyEx gibt jetz 0 zurück ,also ERROR_SUCCESS und RegDeleteKeyEx 6 ,also ERROR_INVALID_HANDLE.Ich blick echt nicht ,was da anstelle s.c_str() rein müsste ? o.O

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »MuesliSchuessel« (07.03.2013, 16:40)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

07.03.2013, 16:49

Den Key zu dem dein path führt hast du ja schon als hKey geöffnet. Der Pfad den du an RegDeleteKeyEx() übergibst ist also bereits relativ zu path...

  • »MuesliSchuessel« ist der Autor dieses Themas

Beiträge: 25

Beruf: Schüler

  • Private Nachricht senden

5

07.03.2013, 19:31

Und was muss statt dessen rein ? Ich bekomms nicht hin . Egal was ich mach , ich bekomm immer ERROR_INVALID_HANDLE.
Ich stell mich da echt blöd an ...

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

07.03.2013, 19:38

Wie sieht deine Struktur in der Registry genau aus und wie heißt der Key, den du dort löschen willst? Und wofür eigentlich das KEY_WOW64_64KEY?

  • »MuesliSchuessel« ist der Autor dieses Themas

Beiträge: 25

Beruf: Schüler

  • Private Nachricht senden

7

07.03.2013, 19:41

Sieht so aus : HKEY_CLASSES_ROOT\.te\shell\Open TE\command . Und bei "command" hab ich den Wert drin,damit die Datei mit dem Programm verknüpft wird ,also "<exe-pafd> %1".
Und das will ich weg haben ,also : .te\shell\Open TE\command .
Und des KEY_WOW64_64KEY brauch ich doch ,oder nicht ? o.O

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

07.03.2013, 19:47

Du willst also den Subkey Namens command löschen. Dann schlag ich vor, du öffnest den Key HKEY_CLASSES_ROOT\.te\shell\Open TE\ und löscht dann den Subkey namens command. Der konkrete Wert des Subkey sollte dabei völlig irrelevant sein. Bezüglich des KEY_WOW64_64KEY hätte meine Frage wohl eher lauten sollen: Wieso überhaupt RegDeleteKeyEx() und nicht einfach nur RegDeleteKey()?

  • »MuesliSchuessel« ist der Autor dieses Themas

Beiträge: 25

Beruf: Schüler

  • Private Nachricht senden

9

07.03.2013, 20:12

Bezüglich des KEY_WOW64_64KEY hätte meine Frage wohl eher lauten sollen: Wieso überhaupt RegDeleteKeyEx() und nicht einfach nur RegDeleteKey
Das lag an der Beschreibung von RegDeleteKey in der MSDN http://msdn.microsoft.com/en-us/library/…5(v=vs.85).aspx .

Zitat

64-bit Windows: On WOW64, 32-bit applications view a
registry tree that is separate from the registry tree that 64-bit
applications view. To enable an application to delete an entry in the
alternate registry view, use the RegDeleteKeyEx function.
Ich hab Win-7 64-bit.

Und der Code sollte eigentlich so aus sehen ,wenn ichs richtig verstanden hab :

C-/C++-Quelltext

1
2
3
4
5
HKEY hKey;
string path = ".te\\shell\\Open TE\\"
RegOpenKeyEx(HKEY_CLASSES_ROOT,path.c_str(),0,KEY_ALL_ACCESS ,&hKey);
RegDeleteKey(hKey,"command");
RegCloseKey(hKey);


Oder anders ?
Weil das nämlich immer noch den gleichen Fehler ausgibt ?(

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

07.03.2013, 21:51

Ok, ich denk das Problem ist immer noch, dass du Keys und Values durcheinanderbringst. Ich vermute mal, command ist gar nicht der Key, sondern Open TE und command ist nur ein Value in diesem Key!?

Bezüglich des KEY_WOW64_64KEY hätte meine Frage wohl eher lauten sollen: Wieso überhaupt RegDeleteKeyEx() und nicht einfach nur RegDeleteKey
Das lag an der Beschreibung von RegDeleteKey in der MSDN http://msdn.microsoft.com/en-us/library/…5(v=vs.85).aspx .

Zitat

64-bit Windows: On WOW64, 32-bit applications view a
registry tree that is separate from the registry tree that 64-bit
applications view. To enable an application to delete an entry in the
alternate registry view, use the RegDeleteKeyEx function.
Ich hab Win-7 64-bit.

Lass mich das gleiche Zitat nochmal bringen, diesmal aber mit den Dingen hervorgehoben, die dabei wirklich interessant sind:

Zitat von »MSDN«

64-bit Windows: On WOW64, 32-bit applications view a registry tree that is separate from the registry tree that 64-bit applications view. To enable an application to delete an entry in the alternate registry view, use the RegDeleteKeyEx function.

;)

Auch solltest du laut MSDN HKEY_CLASSES_ROOT nur verwenden, wenn du Informationen über alle registrierten Extensions auslesen willst. Wenn du die entsprechenden Informationen modifizieren willst, solltest du die korrespondierenden Zweige in HKEY_CURRENT_USER und HKEY_LOCAL_MACHINE benutzen, da dabei explizit wird, ob du die Information nur für den aktuellen Benutzer oder global für den ganzen Computer ändern willst...

Werbeanzeige