Ich würde es ganz anders machen. Wenn du herausfinden willst, ob bereits der Wert existiert, dann brauchst du dazu schon mal nicht alle Zugriffsrechte, und du kannst auch darauf verzichten, den Schlüssel anzulegen (wie tomtom62schon schrieb). Leserechte reichen und funktionieren dann auch mit normalen bzw. eingeschränkten Benutzerrechten problemlos:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| regist := TRegistry.Create(KEY_READ); if(regist <> nil) then with regist do try RootKey := HKEY_CLASSES_ROOT; if(OpenKey('*\Shell\ShredExplor\command', FALSE)) then try FOptionen.CBKontextmen.Checked := (ReadString('') <> ''); finally CloseKey; end; finally Free; end; |
Du könntest aber zur Sicherheit noch mit "pos" prüfen, ob der Name deines Programms auch in dem ausgelesenen String vorkommt. Also bspw. so (ungetestet!):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| if(OpenKey('*\Shell\ShredExplor\command', FALSE)) then try s := ReadString(''); FOptionen.CBKontextmen.Checked := (s <> '') and (pos(uppercase(paramstr(0)),uppercase(s)) > 0); finally CloseKey; end; |
Das Schreibproblem sehe ich persönlich nicht als solches an. Man kann davon ausgehen, dass man min. Admin-Rechte haben sollte. Ich habe erst kürzlich bei einer anderen Frage darauf verwiesen:
ISADMIN. Schau dir mal die Beiträge an, die die Suchfunktion der Delphi-Praxis ausspuckt. Viele sind´s nicht, und in einem davon hat Luckie Code gepostet, mit dem du herausfinden kannst, ob du Admin-Rechte hast oder nicht. Anwendungsbeispiel (falls möglich, dann auch in "OnCreate"):
Delphi-Quelltext
1:
| FOptionen.CBKontextmen.Enabled := IsAdmin; |
Voilà.
Und auch wenn du dann Admin-Rechte hast, will sagen: wenn die Checkbox verfügbar ist, solltest du nicht auf
try/
finally verzichten. Es kann trotzdem mal was schiefgehen, und dann bekommst du (bzw. evtl. der Anwender) unschöne Fehlermeldungen um die Ohren.
@tomtom62:
| Zitat: |
| (Formshow ist vielleicht besser) |
"OnCreate" ist schon in Ordnung.
