Autor Beitrag
Don Krawallo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45

Windows 10 x64
Delphi 10.4.1
BeitragVerfasst: Sa 19.03.11 19:30 
Ich wünsche einen schönen Tag und hoffe das mir einer bei meinem Problem helfen kann.

Folgendes...
Ich versuche mittels
ausblenden Delphi-Quelltext
1:
Reg.WriteString('IsShortcut'' ');					
einen String bzw. eine Zeichenfolge in die Registry zu schreiben.

Die komplette Prozedur sieht folgendermaßen aus...
ausblenden 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 user profile iconNarses: Topic aus Windows API verschoben am Sa 19.03.2011 um 19:26
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45

Windows 10 x64
Delphi 10.4.1
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 19.03.11 20:00 
Ich habe es ganz übersehen:
user profile iconDon Krawallo hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden 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:
ausblenden 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;

Für diesen Beitrag haben gedankt: Don Krawallo
Don Krawallo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45

Windows 10 x64
Delphi 10.4.1
BeitragVerfasst: 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.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 19.03.11 22:42 
Vo rallem, wenn du mal die Rückgabewerte überprüft und ausgewertet hättest.
Don Krawallo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45

Windows 10 x64
Delphi 10.4.1
BeitragVerfasst: 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.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 20.03.11 18:25 
Normalerweise wird da vermutlich schlicht die entsprechende Windows Message WM_SETTINGSCHANGE geschickt. :nixweiss:
msdn.microsoft.com/e...725497(v=vs.85).aspx

Und zum Debuggen reicht der interne Debugger von Delphi auch in der Regel aus.
Don Krawallo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45

Windows 10 x64
Delphi 10.4.1
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45

Windows 10 x64
Delphi 10.4.1
BeitragVerfasst: 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...
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 23.03.11 15:52 
user profile iconDon Krawallo hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45

Windows 10 x64
Delphi 10.4.1
BeitragVerfasst: 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...
ausblenden 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...
ausblenden Delphi-Quelltext
1:
2:
3:
Uses ShlObj
...
SHChangeNotify(SHCNE_ASSOCCHANGED, 0nilnil);


So funktioniert das wie ich mir das vorgestellt habe. Trotzdem Danke für die Antworten.
grEEtZ Don Krawallo