Wendelin Uez
unread,Nov 5, 2023, 11:38:13 AM11/5/23You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to
Ich möchte das Explorer-Kontextmenü per Code um einen Eintrag erweitern und
habe im Netz dazu nur genau den einen untenstehenden Beispielcode gefunden.
Der Men+eintrag soll per Code angelegt und wieder entfernt werden können.
Anlegen funktioniert immer und wiederholungstolerant (d.h. auch mehrfaches
Anlegen ergibt immer nur einen Eintrag), aber die Löschfunktion verhält sich
merkwürdig:
Wenn z.B. der angelegte Beitrag versehentlich ein zweites Mal gelöscht
werden soll und danach wieder angelegt wird, dann klappt das zwar mit dem
erneut anlegen, aber der folgende Löschversuch schlägt fehl.
Konkret liefert in diesem Fall bereits der erste Aufruf von RegOpenKeyEx in
der Function Delete_ContextItem den Fehlercode 2 und damit kein Handle hKey
auf den Eintrag, selbst wenn das Programm neu gestartet wurde, im Explorer
der Menüeintrag angezeigt wird und eigentlich alles auf Neustart steht.
Wieso verhält sich RegOpenKeyEx dann unterschiedlich bei dennselben
Ausgangsbedingungen bez. Existenz des Eintrags?
Hier der Code aus dem Netz:
Public Function Delete_ContextItem( _
ByVal strText As String) As Boolean
Dim lResult As Long
Dim hKey As Long
Dim strKey As String
' Registry-Zweig öffnen
strKey = "*\shell\" + strText
'**** hier geht's manchmal schief: ***
lResult = RegOpenKeyEx(HKEY_CLASSES_ROOT, strKey, _
0, KEY_SET_VALUE, hKey)
If lResult = 0 Then
' SubKey \Command löschen
lResult = RegDeleteKey(hKey, "Command")
If lResult = 0 Then
' Registry-Zweig schliessen
Call RegCloseKey(hKey)
' Registry-Zweig öffnen "*\shell)"
strKey = "*\shell"
lResult = RegOpenKeyEx(HKEY_CLASSES_ROOT, strKey, _
0, KEY_SET_VALUE, hKey)
If lResult = 0 Then
' SubKey "strText" löschen
lResult = RegDeleteKey(hKey, strText)
Delete_ContextItem = (lResult = 0)
' Registry-Zweig schliessen
Call RegCloseKey(hKey)
End If
Else
' Registry-Zugriff schliessen
Call RegCloseKey(hKey)
End If
End If
End Function
Und für den, den's interessiert, die Sub um den Eintrag anzulegen:
Public Sub ProgrammRegistrierung(ByVal strMenuText As String, _
ByVal strAnwendung As String)
Const HKEY_CLASSES_ROOT = &H80000000
Const REG_SZ = 1
Dim Key As String
Dim Result As Long
Dim phkResult As Long
Dim strText As String
Key = "*\shell\" + strMenuText + "\command"
Result = RegCreateKey(HKEY_CLASSES_ROOT, Key, phkResult)
strText = strAnwendung + " %1"
Result = RegSetValue(HKEY_CLASSES_ROOT, Key, REG_SZ, _
strText, Len(strText))
End Sub