Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Fehlermeldung beim Schreiben in der Registry (https://www.delphipraxis.net/208339-fehlermeldung-beim-schreiben-der-registry.html)

Amalkotey 16. Jul 2021 16:28

Fehlermeldung beim Schreiben in der Registry
 
Moin,

nach einer langen und schweren Erkrankung, bin ich gerade dabei, meine Programme an Windows 10 x64 mit Delphi 7 Pro anzupassen. Ich stelle nun mehr fest, das ich viel vergessen habe.

Nun zu meinnem Problem. Ich ver suche mit nachfolgenden Code

Delphi-Quellcode:
Procedure SetRegistryRun(User: Integer);
Var
  Reg: TRegistry;
  Titel : String;

Const
  KEY_WOW64_64KEY = $0100;
  KEY_WOW64_32KEY = $0200;

Begin
  If IsWow64 = True Then Begin
    Reg := TRegistry.Create(KEY_ALL_ACCESS OR KEY_WOW64_64KEY);
  End Else Begin
    Reg := TRegistry.Create(KEY_ALL_ACCESS OR KEY_WOW64_32KEY);
  End;
  Try
   If User = 1 Then
        Reg.RootKey := HKEY_LOCAL_MACHINE
      Else
        Reg.RootKey := HKEY_CURRENT_USER;
    If Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', True) then Begin
      Titel := Application.Title;
         Titel := strLeft(Titel, Pos('WINDOWS', Titel) + 6);
      Reg.WriteString(Titel, Application.ExeName);
      AlertBox('SetRegistryRun: ' + SysErrorMessage(GetLastError), 'Fehlermeldung', 0);
       Reg.CloseKey;
    End;
   Finally
     Reg.Free;
   End;
End;
einen Wert in 'Software\Microsoft\Windows\CurrentVersion\Run' zu schreiben. Bei HKEY_CURRENT_USER funktioniert es einwandfrei. Bei HKEY_LOCAL_MASCHINE im Gegensatz nicht. Was ist Falsch? Ich bitte um Hilfe

-Amalkotey-

Delphi.Narium 16. Jul 2021 16:45

AW: Fehlermeldung beim Schreiben in der Registry
 
Tippe mal darauf, dass Deine Anwendung nicht über die notwendigen Rechte zum Schreiben unter HKEY_LOCAL_MACHINE verfügt.

Was wird denn hier
Delphi-Quellcode:
AlertBox('SetRegistryRun: ' + SysErrorMessage(GetLastError), 'Fehlermeldung', 0);
konkret ausgegeben?

himitsu 16. Jul 2021 19:00

AW: Fehlermeldung beim Schreiben in der Registry
 
Zitat:

Was wird denn hier
Falls es überhaupt bis dahin kommt und nicht vorher schon abraucht.

Wenn das Programm nicht als Administrator gestartet wurde, dann wird selbst eine Anwendung im AdminAccount erstmal Elevated gestartet und bekommt nicht sämtliche Rechte.



Und ja, es wäre bestimmt hilfreich gewesen, wenn jemand gesagt hätte, wie diese ominöse "Fehlermeldung" den lautet.

Amalkotey 16. Jul 2021 23:35

AW: Fehlermeldung beim Schreiben in der Registry
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1492428)
Tippe mal darauf, dass Deine Anwendung nicht über die notwendigen Rechte zum Schreiben unter HKEY_LOCAL_MACHINE verfügt.

Was wird denn hier
Delphi-Quellcode:
AlertBox('SetRegistryRun: ' + SysErrorMessage(GetLastError), 'Fehlermeldung', 0);
konkret ausgegeben?

An der Stelle wo die AlertBox ausgegben wird kommt die Abarbeitung nicht hin. Ich habe die Ausgabe jetzt in den Finally-Block gesetzt, und da Erscheit "Der Vorgang wurde erfolgreich beendet.". Anscheinscjhliessend erschein eine Mitteilung von "fehler bein setzen derDaten für ...". Ich gehe davon aus, das es An den Berechtigungen liegt, da die Daten bei HKEY_CURRENT_USER korrekt geschrieben werden.

Ich kann ich dem Programm die Berechtigungen erteilen? Unter Windows7 wurden die Daten korrekt geschrieben. Danke für die Hilfe im Voraus.

-Amalkotey-

jaenicke 17. Jul 2021 00:41

AW: Fehlermeldung beim Schreiben in der Registry
 
Zitat:

Zitat von Amalkotey (Beitrag 1492451)
Ich kann ich dem Programm die Berechtigungen erteilen?

Du kannst es mit rechter Maustaste und Als Administrator ausführen starten.

Oder du kannst aus dem Programm heraus das Programm selbst noch einmal starten und dabei Adminrechte anfordern. Dazu gibst du dann noch Parameter mit, damit die neue Instanz weiß, dass sie die Werte in die Registry schreiben und sich wieder beenden soll statt normal zu starten.

Du kannst auch in den Projektoptionen unter Anwendung --> Manifest bei Aufruferebene den Eintrag Administrator erforderlich auswählen. Dann werden die Administratorrechte automatisch angefordert. Aber das ist für diesen Zweck nicht sinnvoll.

Zitat:

Zitat von Amalkotey (Beitrag 1492451)
Unter Windows7 wurden die Daten korrekt geschrieben.

Dann waren die Rechte im System nicht richtig eingestellt, z.B. durch Deaktivierung der für die Sicherheit wichtigen Benutzerkontensteuerung.

Amalkotey 17. Jul 2021 15:21

AW: Fehlermeldung beim Schreiben in der Registry
 
Zitat:

Zitat von jaenicke (Beitrag 1492452)
Zitat:

Zitat von Amalkotey (Beitrag 1492451)
Ich kann ich dem Programm die Berechtigungen erteilen?

Du kannst auch in den Projektoptionen unter Anwendung --> Manifest bei Aufruferebene den Eintrag Administrator erforderlich auswählen.

@Jänicke:

Unter Delphi 7 Enterprise gibt es diese Möglichkeit nicht.

-Amalkotey-

himitsu 17. Jul 2021 17:00

AW: Fehlermeldung beim Schreiben in der Registry
 
SuFu benutzen und fertiges Manifest suchen, bzw, selbst eines Bauen und als RES einbinden.

Dalai 17. Jul 2021 17:11

AW: Fehlermeldung beim Schreiben in der Registry
 
Der richtige Weg wurde von jaenicke eigentlich bereits beschrieben: Eigenes Programm nochmals als Administrator starten und die zweite Instanz die Daten schreiben lassen. Alternativ kann man auch ein anderes Programm als Administrator starten, das diese Aufgabe übernimmt. In diesem simplen Fall wäre das sogar mit dem bei Windows mitgelieferten reg.exe möglich.

Ein Manifest einzubinden, das dazu führt, dass das Programm permanent als Administrator läuft, ist eigentlich nur für Programme gedacht, die gar nicht ohne diese Berechtigungen auskommen: alles mit Direktzugriff auf Datenträger oder andere Hardware, zum Installieren von Treibern und Bearbeiten von Diensten usw.

[EDIT]
Andere Programme mit Anforderung von Adminrechten starten geht z.B. bei ShellExecute(Ex) über das Verb 'runas' (statt dem standardmäßigen 'open'). Wichtig: Ist die UAC deaktiviert (und der Nutzer hat keine Adminrechte), bewirkt das Verb 'runas' gar nichts. D.h. man sollte dennoch entweder auf das Vorhandensein der nötigen Berechtigungen prüfen und/oder darauf vorbereitet sein, dass der Vorgang fehlschlagen kann.
[/EDIT]

Grüße
Dalai

Amalkotey 17. Jul 2021 17:36

AW: Fehlermeldung beim Schreiben in der Registry
 
Zitat:

Zitat von himitsu (Beitrag 1492465)
SuFu benutzen und fertiges Manifest suchen, bzw, selbst eines Bauen und als RES einbinden.

@Himitsu:

Ich habe Dein Programm Manifest-Creator gefunden. Kann ich das Manifest über das Programm erstellen?

-Amalkotey-

Amalkotey 18. Jul 2021 16:47

AW: Fehlermeldung beim Schreiben in der Registry
 
@All:

Ich lege meine Anpassungren erstmal auf Eis. Aufgrund meiner Niereninsuffizienz - dialysepflichtigt - funktioniert mein Kopf noch nicht richtig, da ich einen Vergiftungsgrad von 21 habe. Vielen Dank für die bisherige Hilfe. Ich komme, wenn der Vergiftungsgrad weiter gesunken ist, auf den einen oder anderren Forumskollegen zu, um mit dem Manifest weiter zukommen.

Bleibt Gesundt!

-Amalkotey-

generic 31. Jul 2021 16:43

AW: Fehlermeldung beim Schreiben in der Registry
 
@Amalkotey
Dein Beitrag und Frage fande ich so interessant, dass ich so frei war und habe ein CodeReview gemacht.

In diesem Youtube-Video teile ich meine Gedanken zu dem Quelltext von dir mit dir/euch:
https://youtu.be/5Owfu_MstcU

Amalkotey 1. Aug 2021 12:08

AW: Fehlermeldung beim Schreiben in der Registry
 
@generic: Danke fü+r Deinen Beitrag.

venice2 1. Aug 2021 17:24

AW: Fehlermeldung beim Schreiben in der Registry
 
@generic
Feine Sache gut erklärt! :thumb:

Eins sollte man jedoch ändern wenn man vom Code her schon so penibel ist.

Delphi-Quellcode:
  If IsWow64 = True Then Begin
    Reg := TRegistry.Create(KEY_ALL_ACCESS OR KEY_WOW64_64KEY);
  End Else Begin
    Reg := TRegistry.Create(KEY_ALL_ACCESS OR KEY_WOW64_32KEY);
  End;
zu
Delphi-Quellcode:
  If IsWow64 Then
    Reg := TRegistry.Create(KEY_ALL_ACCESS OR KEY_WOW64_64KEY)
  Else
    Reg := TRegistry.Create(KEY_ALL_ACCESS OR KEY_WOW64_32KEY);

generic 2. Aug 2021 09:54

AW: Fehlermeldung beim Schreiben in der Registry
 
@venice2

Eigentlich hast du nur den Code anders formatiert.

In der C# Welt gibt es den Resharper, da kannst du den Formater richtig schön einstellen und dann ist das so wie es sein soll.
Dieser kann sogar die Reihenfolge von private und public Sachen in Klassen umstellen - Microsoft hat da Empfehlungen.

Aus diesem Grund kümmern sich die Teams wo ich arbeite nicht um sowas.
Auch die Einrück-Diskussion Tabs oder Spaces - 2 oder 4 gibt es nicht. Wenn jemand was anderes haben will, soll er sich es einstellen wie er will. Vor dem Commit ins GIT läuft ein Script, welches das auf die Team-Norm bringt.

Sowas wie den Resharper wünsche ich mir schon sehr lange für Delphi.

Wichtig ist nur, dass Team muss seinen einen Stil haben und Hauptsache es ist einheitlich im *ganzen* Projekt.

Persönlich mag ich deine Variante lieber.

Beide Varianten haben Vorteile:
deine Version - schlanker und evtl. besser zu lesen.
Amalkotey Version - schneller mit Code zu erweitern und weniger Chance was kaputt zu machen, wenn es z.B. verschachtelte IFs gibt.

DeddyH 2. Aug 2021 11:47

AW: Fehlermeldung beim Schreiben in der Registry
 
Wichtiger scheint mir der fehlerträchtige Vergleich mit true zu sein.

venice2 2. Aug 2021 11:53

AW: Fehlermeldung beim Schreiben in der Registry
 
Zitat:

Eigentlich hast du nur den Code anders formatiert.
Nein ich habe das True entfernt das ist der Entscheidende Faktor.
Und bei einer einfachen If Verschachtlung braucht man kein Begin .. End da reicht ein Else.
Zitat:

Zitat von DeddyH (Beitrag 1493125)
Wichtiger scheint mir der fehlerträchtige Vergleich mit true zu sein.

Richtig!

Auf der einen Seite schreibt er in seinem Beitrag
Delphi-Quellcode:
if not isUser

was ja auch korrekt ist.

Auf der anderen Seite könnte er es aber auch so schreiben
Delphi-Quellcode:
if isUser = False then

Das ist aber so wie du schreibst fehlerträchtig.

Es ging nicht um die Formatierung oder ob ein oder mehr Begin nötig sind sondern nur um die Prüfung auf "True"

freimatz 2. Aug 2021 11:56

AW: Fehlermeldung beim Schreiben in der Registry
 
:thumb:
Zitat:

Zitat von venice2 (Beitrag 1493093)
...
Eins sollte man jedoch ändern wenn man vom Code her schon so penibel ist.
... If IsWow64 Then
Reg := TRegistry.Create(KEY_ALL_ACCESS OR KEY_WOW64_64KEY)
Else
Reg := TRegistry.Create(KEY_ALL_ACCESS OR KEY_WOW64_32KEY);[/DELPHI]

Und wenn schon, denn schon ;-)
DRY - Don't repeat yourself. Also:
beim if nur KEY_WOW64_64KEY oder KEY_WOW64_32KEY in lokaler Variable speicher und danach nur 1x "TRegistry.Create(KEY_ALL_ACCESS "

venice2 2. Aug 2021 12:00

AW: Fehlermeldung beim Schreiben in der Registry
 
Zitat:

Zitat von freimatz (Beitrag 1493127)
:thumb:
Zitat:

Zitat von venice2 (Beitrag 1493093)
...
Eins sollte man jedoch ändern wenn man vom Code her schon so penibel ist.
... If IsWow64 Then
Reg := TRegistry.Create(KEY_ALL_ACCESS OR KEY_WOW64_64KEY)
Else
Reg := TRegistry.Create(KEY_ALL_ACCESS OR KEY_WOW64_32KEY);[/DELPHI]

Und wenn schon, denn schon ;-)
DRY - Don't repeat yourself. Also:
beim if nur KEY_WOW64_64KEY oder KEY_WOW64_32KEY in lokaler Variable speicher und danach nur 1x "TRegistry.Create(KEY_ALL_ACCESS "

Ich wollte nicht seinen Code umschreiben und habe ihn so übernommen.
Es ging nur um das Fail bzgl. auf True hin zu prüfen.
Der Rest hat mich nicht Interessiert da diese Create Methode im Nachhinein in seinem Video geändert wurde.

generic 2. Aug 2021 15:23

AW: Fehlermeldung beim Schreiben in der Registry
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hätte jetzt schwören können, dass der Compiler mit Optimierung
Code:
if a=true then
genau so behandelt wie
Code:
if a then
Aber es kommt was anderes raus:
Anhang 54226

Code:
if a<>false then
ist wie
Code:
if a then

freimatz 2. Aug 2021 15:46

AW: Fehlermeldung beim Schreiben in der Registry
 
Oh, jetzt bin ich baff. Ist die Optimierung aus? Oder so schlecht?
Nachtrag: liegt wohl daran, dass True so definiert ist: type Boolean = (False, True); True hat dann den Ordinalwert 1 und ist eben nicht immer not False.

Sinspin 2. Aug 2021 16:59

AW: Fehlermeldung beim Schreiben in der Registry
 
Zitat:

Zitat von generic (Beitrag 1493134)
Aber es kommt was anderes raus:
Anhang 54226

So schön einfach kann man sich Probleme einhandeln. Das sollte sich jeder von uns ausdrucken und unters Kopfkissen legen!

himitsu 2. Aug 2021 17:12

AW: Fehlermeldung beim Schreiben in der Registry
 
Delphi-Quellcode:
if B then


entspricht "logisch" einem

Delphi-Quellcode:
if B <> False then

aber in Real ist Letzeres natürlich ein
Delphi-Quellcode:
cmp al,$00; jz $********


In Worten:
"du bist irgendein Mensch"
gegen
"du bist genau dieser Mensch"

Delphi-Quellcode:
var B: Boolean;

B := Boolean(2);

if B then Beep; // if Ord(B) <> 0 then
if not B then {Kein}Beep; // if Ord(B) = 0 then
if B = True then {Kein}Beep;
if B = False then {Kein}Beep;
if B = Boolean(2) then Beep;
Boolean und ByteBool sind 1 Byte groß, nicht 1 Bit, also haben 1*False und 255*True, aber die Konstante "True" entspricht nur genau einem der vielen True's.
Und beim LongBool sind es sogar über 4 Milliarden "True".

Boolean: True = $01 aka +1
ByteBool: True = $FF aka -1

venice2 2. Aug 2021 17:28

AW: Fehlermeldung beim Schreiben in der Registry
 
:thumb:

freimatz 3. Aug 2021 06:43

AW: Fehlermeldung beim Schreiben in der Registry
 
Zitat:

Zitat von venice2 (Beitrag 1493139)
:thumb:

Auch von mir ein :thumb: für die Erklärung.
Wer jedoch so programmiert, dass das eine Rolle spielt: :wall:

Rollo62 3. Aug 2021 07:15

AW: Fehlermeldung beim Schreiben in der Registry
 
@generic

CodeReviews finde ich eine tolle Sache, gerne mehr davon.
Ich hatte mir das Exercism.io angesehen, das läuft auch irrgendwie darauf hinaus sich verschiedenste Lösungen anzusehen.
https://en.delphipraxis.net/topic/53...#comment-46137

Ist aber leider beim Review etwas umständlich, und ausserdem für Anfänger gedacht.

Amalkotey 19. Aug 2021 15:14

AW: Fehlermeldung beim Schreiben in der Registry
 
Zitat:

Zitat von himitsu (Beitrag 1492465)
SuFu benutzen und fertiges Manifest suchen, bzw, selbst eines Bauen und als RES einbinden.

Himitsu: Ich habe mir Deinen Manifest Creator geladen und ein Manifest mit Adminrechte erstellt. Dieses als *.res eingebunden im der Projektdatei, und habe keine Adminrechte. Wie funktioniert das mit runas? Muss ich die erste Instanz meines Programmes beenden? Damke für die Hile im voraus.

-Amalkotey-


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz