Entwickler-Ecke
Dateizugriff - TRegistry - "Fehler beim setzen der Daten für ..."
Don Krawallo - Sa 19.03.11 19:30
Titel: TRegistry - "Fehler beim setzen der Daten für ..."
Ich wünsche einen schönen Tag und hoffe das mir einer bei meinem Problem helfen kann.
Folgendes...
Ich versuche mittels
Delphi-Quelltext
1:
| Reg.WriteString('IsShortcut', ' '); |
einen String bzw. eine Zeichenfolge in die Registry zu schreiben.
Die komplette Prozedur sieht folgendermaßen aus...
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| Reg := TRegistry.Create(KEY_ALL_ACCESS); Reg.RootKey := HKEY_LOCAL_MACHINE; Reg.OpenKey('HKEY_LOCAL_MACHINE\SOFTWARE\Classes\lnkfile', True); Reg.WriteString('IsShortcut', ' '); Reg.CloseKey; Reg.Free; |
Momentan ist diese Prozedur (Button.Click) als einzige auf der Form enthalten, nichts Großes also. Beim ausführen des Programms, wohl gemerkt als Admin, bekomme ich allerdings die Fehlermeldung "Fehler beim setzen der Daten für 'IsShortcut'". Der String ist auch (noch) nicht in der Windows Registry enthalten und/oder besitzt einen anderen Wert (Integer, Binary etc.). Eine Firewall oder ähnliches behindert auch nicht die Ausführung des Programms.
Vielleicht noch was zur Erklärung... Steht der Eintrag in der Registry, werden z.b. auf dem Desktop die Icons mit einem kleinen Pfeil versehen. Diese Option hab ich standardmäßig deaktiviert. Unter diversen Umständen ist es allerdings nötig das dieser String in der Registry existiert, z.b. wenn man unter Windows 7 Programmsymbole an die Start-/Taskleiste anheften möchte. Um nun nicht ständig den Registry Editor anzuschmeißen wollt ich das Ganze in ein kleines Programm verpacken.
Vielleicht hat jemand von euch noch einen Tipp oder nen konkreten Lösungsansatz.
Danke schonmal im vorraus für eure Mühe.
MFG Don Krawallo
Moderiert von
Narses: Topic aus Windows API verschoben am Sa 19.03.2011 um 19:26
jaenicke - Sa 19.03.11 19:33
Führ das Programm mit Adminrechten aus. Ohne darfst du dort natürlich keine Änderungen vornehmen. ;-)
Mit IsUserAnAdmin kannst du auch vorher prüfen, ob du schon Adminrechte hast und diese ansonsten anfordern.
Don Krawallo - Sa 19.03.11 19:51
Danke für die schnelle Antwort, aber wie ich bereits schrieb wird das Programm bereits mit Admin-Rechten gestartet und dennoch erhalte ich diese Fehlermeldung. Das was mich eigentlich wundert ist - Wenn ich den Registrierungseditor mit Admin-Rechten starte, kann ich den besagten Registry-Schlüssel bearbeiten/löschen etc. Starte ich das Programm mit Admin-Rechten klappt das allerdings nicht.
jaenicke - Sa 19.03.11 20:00
Ich habe es ganz übersehen:
Don Krawallo hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3:
| Reg := TRegistry.Create(KEY_ALL_ACCESS); Reg.RootKey := HKEY_LOCAL_MACHINE; Reg.OpenKey('HKEY_LOCAL_MACHINE\SOFTWARE\Classes\lnkfile', True); | |
Du kannst keinen Schlüssel mit Namen HKEY_LOCAL_MACHINE unterhalb von HKEY_LOCAL_MACHINE anlegen...
Nebenbei fehlt auch der Ressourcenschutzblock und die Fehlerbehandlung:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| Reg := TRegistry.Create(KEY_ALL_ACCESS); try Reg.RootKey := HKEY_LOCAL_MACHINE; if Reg.OpenKey('SOFTWARE\Classes\lnkfile', True) then Reg.WriteString('IsShortcut', ' '); Reg.CloseKey; finally Reg.Free; end; |
Don Krawallo - Sa 19.03.11 20:18
Man man man... Was für eine Schande. Jetzt seh ichs auch. Hätte ich eigentlich auch selbst drauf kommen können. :oops:
Nochmals Danke.
Delete - Sa 19.03.11 22:42
Vo rallem, wenn du mal die Rückgabewerte überprüft und ausgewertet hättest.
Don Krawallo - So 20.03.11 18:20
Gut gebrüllt... Löwe. :wink:
Aber mit dem Debugger arbeite ich mich erst ran. Okay, ich hätte OllyDBG zur Hilfe nehmen können, aber daran hatte ich in erster Linie garnicht gedacht.
Interessehalber würde mich allerdings mal noch eine Frage interessieren. Wenn die Änderungen in der Registry geschrieben werden ist es ja von Nöten das Windows entweder neu gestartet oder man sich einmal ab- und wieder neu anmeldet. Gibt es dafür eine Option bzw. Schnittstelle damit die Änderungen ohne Neustart des Systems sichtbar sind? Denn einfach per Taste F5 passiert z.b. garnix.
Fakt ist das es machbar ist. Das sieht man z.b. bei verschiedenen "Installern". Hat man z.b. ein Programm installiert flackert zum Schluß kurz der Desktop und etwaiige Änderungen sind sofort sichtbar.
Don Krawallo - So 20.03.11 19:01
Das glaub ich Dir gern das dieser ausreicht/ausreichen sollte. Mit OllyDBG hab ich allerdings mehr Erfahrung. Natürlich ist es dann so wenn ein Programm schon garnicht gestartet werden kann das mit dem Debugger dann auch nicht weiterkommt.
Was ich zumindest schonmal im Delphi Debugger gefunden oder vielmehr rausgefunden habe ist eben das man z.b. Variablen auf ihre Zustände prüfen kann.
Aber um das volle Potenzial auszuschöpfen bedarf es noch einer gewissen Einarbeitung.
Don Krawallo - Mi 23.03.11 15:49
Tagchen...
Ich hab mal ein bissl mit der Option "WM_SettingChange" rumgespielt. Bin mir allerdings nicht ganz sicher ob das dass richtige ist.
Die Syntax sieht ja folgendermaßen aus...
Quelltext
1: 2: 3: 4: 5: 6:
| LRESULT WINAPI SendMessage( __in HWND hWnd, __in UINT Msg, __in WPARAM wParam, __in LPARAM lParam ); |
Für was sind eigentlich die beiden zu erwartenten Parameter zuständig? Die MSDN Datenbank hält sich dazu sehr bedeckt. Oder ist es in diesem Fall so das es hier reicht für diese den Wert 0 (Null) zu übergeben?
jaenicke - Mi 23.03.11 15:52
Don Krawallo hat folgendes geschrieben : |
Die MSDN Datenbank hält sich dazu sehr bedeckt. Oder ist es in diesem Fall so das es hier reicht für diese den Wert 0 (Null) zu übergeben? |
Ja, laut Dokumentation schon. Aber was heißt die Doku hält sich bedeckt zu dem Thema? In dem von mir verlinkten Beitrag findest du doch eine sehr ausführliche Erklärung. :gruebel:
Genauer gesagt:
Zitat: |
wParam
[...]
When an application sends this message, this parameter must be NULL.
lParam
[...]
This string can be the name of a registry key or the name of a section in the Win.ini file. When the string is a registry name, it typically indicates only the leaf node in the registry, not the full path. |
Da steht doch alles. :nixweiss:
Don Krawallo - Sa 26.03.11 17:16
Tagchen...
Ich habe mich nachwievor damit befasst dies zu implementieren. Allerdings ist die "SendMessage" API nicht die Lösung.
Siehe MSDN Datenbank...
Quelltext
1: 2: 3: 4: 5: 6:
| void SHChangeNotify( LONG wEventId, UINT uFlags, __in_opt LPCVOID dwItem1, __in_opt LPCVOID dwItem2 ); |
Zitat: |
SHCNE_ASSOCCHANGED
A file type association has changed. SHCNF_IDLIST must be specified in the uFlags parameter. dwItem1 and dwItem2 are not used and must be NULL.
|
Das Ganze dann in Delphi folgendermaßen implementiert...
Delphi-Quelltext
1: 2: 3:
| Uses ShlObj ... SHChangeNotify(SHCNE_ASSOCCHANGED, 0, nil, nil); |
So funktioniert das wie ich mir das vorgestellt habe. Trotzdem Danke für die Antworten.
grEEtZ Don Krawallo
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!