AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Seriennummer Informationen in Registry schreiben
Thema durchsuchen
Ansicht
Themen-Optionen

Seriennummer Informationen in Registry schreiben

Ein Thema von dor557 · begonnen am 21. Aug 2010 · letzter Beitrag vom 6. Mär 2012
Antwort Antwort
Seite 2 von 2     12   
angos

Registriert seit: 26. Mai 2004
Ort: Rheine
549 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Seriennummer Informationen in Registry schreiben

  Alt 23. Aug 2010, 08:20
Erstmal danke für die ganzen Antworten.

Mal eine Frage allgemein zur Registry..... Irgend wie habe ich da den sinn nicht verstanden.

HKEY_CURRENT_USER speichert doch die Daten nur in dem Aktuellen Benutzer der angemeldet ist wie der Schlüssel schon sagt. Oder nicht ?

HKEY_LOCAL_MACHINE speichert die Daten doch SYSTEMWEIT was doch wenn man die Seriennummer nur ein mal eingeben will und nicht bei Jedem Benutzer einzeln mehr sinn machen würde oder ?
Seh ich eigentlich auch so. Ich hoffe mal auf Antworten von ein paar Wissenderen hier

Zitat:
@Alle anderen : Auch euch danke. Aber ist es nicht so das ein Runtime Error oder eine Fehlermeldung so oder so auftaucht wenn man die Procedure nicht in eine Try...Except schleife gesetzt hat ?

zumindest war das bisher immer so.
Wenn eine Exception kommt, sollte man möglichst den Fehler in seinem Programm, der eben zu dieser Exception führt, beheben und nicht einfach die Fehlermeldung ausblenden. Wenn ein Rauchmelder alarm schlägt, wirst du auch nach dem Feuer suchen und nicht einfach nur den Alarm ausstellen
Ansgar
  Mit Zitat antworten Zitat
Benutzerbild von dor557
dor557

Registriert seit: 23. Okt 2004
Ort: Walldorf
197 Beiträge
 
Delphi 10.1 Berlin Starter
 
#2

AW: Seriennummer Informationen in Registry schreiben

  Alt 23. Aug 2010, 10:56
@angos : Stimmt mit der Exception. aber wenn kein abfangen ist wird doch dennoch ein Fehler ausgeführt und der Feuermelder wird dennoch gesehen !!!! Odda nischt ???
Sascha Nickel
Man muss die Dinge nehmen wie sie kommen, man kann aber auch dafür sorgen das die dinge so kommen wie man sie nehmen möchte.
  Mit Zitat antworten Zitat
Neumann

Registriert seit: 6. Feb 2006
Ort: Moers
540 Beiträge
 
Delphi 12 Athens
 
#3

AW: Seriennummer Informationen in Registry schreiben

  Alt 23. Aug 2010, 12:13
An Caleb

natürlich wird die Registry später wieder freigegeben, habe ich nur bei dem Beispiel weggelassen.

Der Code ist nicht gleich; ev ist das Problem hier:

Mein Code: reg.OpenKey('Software\ESK',true);

dorr557: OpenKey('Software\DeveloperName\AppName\', True);

Ob dies das Problem ist habe ich nicht geprüft, könnte aber sein.

Gruß

Neumann
Ralf
  Mit Zitat antworten Zitat
angos

Registriert seit: 26. Mai 2004
Ort: Rheine
549 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Seriennummer Informationen in Registry schreiben

  Alt 23. Aug 2010, 13:51
@angos : Stimmt mit der Exception. aber wenn kein abfangen ist wird doch dennoch ein Fehler ausgeführt und der Feuermelder wird dennoch gesehen !!!! Odda nischt ???
Delphi-Quellcode:
try
eineVariable := 1 / 0;
except
end;
hierbei wird der Fehler abgefangen, aber nicht ausgewertet, weiter verarbeitet. Siehe zu dem Thema auch mal in diesen Thread

Gruß

angos
Ansgar
  Mit Zitat antworten Zitat
mz23
(Gast)

n/a Beiträge
 
#5

AW: Seriennummer Informationen in Registry schreiben

  Alt 6. Mär 2012, 07:03
Servus zusammen.
hier mal der Code der das Speichern soll :

Delphi-Quellcode:
Procedure TMainForm.Reg_Sav;
var Reg : TRegistry;
    ver : String;
begin
  Reg := TRegistry.Create;
  with Reg do
  begin
    RootKey := HKEY_LOCAL_MACHINE;
    OpenKey('Software\DeveloperName\AppName\', True);
    WriteString('firma', MainConfig.Firma);
    WriteString('S/NR', MainConfig.SENR);
    CloseKey;
    Free;
  end;
end;
gruss Sascha
Delphi-Quellcode:
var regist: TRegistry;
begin
  regist := TRegistry.Create;
  try
    regist.RootKey := HKEY_CURRENT_USER;
    regist.OpenKey('Software\MeineFirma\MeinProgramm\1.0', true);
    regist.WriteInteger('Left', Form1.Left);
    regist.WriteInteger('Top', Form1.Top);
  finally
    regist.free;
  end;
end;
Bischen Info dazu, da Du geschrieben hast, Dir ist das alles
etwas suspekt, was da passiert (passieren soll).

Als erstes wird nun eine Instanz mit dem Namen "regist" der Klasse TRegisty gebildet. Statt "regist" kann natürlich jeder beliebige, gültige Variablenname verwendet werden.

Als Hauptschlüssel (RootKey) wird hier HKEY_CURRENT_USER verwendet. Diese Zuweisung wäre nicht nötig, da dieser Hauptschlüssel standardmäßig verwendet wird, wenn RootKey nichts zugewiesen wird - aber sicher ist sicher.

Nun wird der Schlüssel geöffnet, in den wir unsere Daten schreiben wollen. Der Boolean-Wert (zweiter Parameter von OpenKey) hat folgende Bedeutung: Bei "true" wird der Schlüssel erzeugt, wenn er noch nicht existiert, bei "false" nicht.

Mit den Methoden WriteInteger werden die Daten gespeichert. Der erste Wert gibt den Namen an, unter dem der folgende Wert (zweiter Parameter) später wieder abrufbar ist. Bei "WriteInteger" muss der zu speichernde Wert natürlich eine Ganzzahl sein. Daneben gibt es für andere Datentypen entsprechende Methoden wie "WriteString", "WriteDateTime", "WriteFloat" usw.

Wird der Registry-Zugriff nicht mehr benötigt, sollte er geschlossen werden (regist.free). Damit wird der Speicherplatz der Instanz "regist" im Arbeitsspeicher wieder freigegeben. Wäre stattdessen ein Zugriff auf einen anderen Schlüssel nötig gewesen, hätte der aktuelle über "CloseKey" geschlossen werden können.

Spezielle Schlüssel in der Registry
Wer etwas in der Registry stöbert, findet einige interessante Schlüssel, die auch von eigenen Anwendungen ausgelesen werden können.

Gutes Beispiel ist der Schlüssel HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Curr entVersion. Zu beachten ist nur, dass unter NT und höher statt "Windows" der Schlüssel "Windows NT" verwendet werden muss.

CurrentVersion Windows-Version, z.B. 5.0
ProductName Klartext Windows-Version, z.B. Microsoft Windows 2000
RegisteredOwner Name des Besitzers
RegisteredOrganization Name der Firma
SourcePath Verzeichnis, aus dem Windows installiert wurde (meist CD)
PathName Windows-Verzeichnis

Allerdings gibt es für alle o.g. Beispiele auch Windows-Funktionen, die die entsprechenden Werte zurückliefern. Wenn man diese verwendet, ist man auf der sicheren Seite und muss nicht berücksichtigen, unter welchen Windows-Versionen sich die Werte in welchen Keys verstecken.

Delphi-Quellcode:
var regist: TRegistry;
begin
  regist := TRegistry.Create;
  try
    regist.RootKey := HKEY_CURRENT_USER;
    regist.OpenKey('Software\MeineFirma\MeinProgramm\1.0', true);
    Form1.Left := regist.ReadInteger('Left');
    Form1.Top := regist.ReadInteger('Top');
  finally
    regist.free;
  end;
Den Read-Methoden (hier ReadInteger) wird in Klammern der Name des Wertes übergeben, der ausgelesen werden soll. Dieser Wert wird dann, wie bei Funktionen üblich, als Ergebniswert zurückgeliefert.

Nun könnte es sein, dass es sich beim Ausführen obiger Methode um den ersten Programmstart handelt, der Schlüssel MeineFirma\MeinProgramm\1.0 also noch gar nicht existiert. Da wir bei OpenKey als zweiten Parameter "true" angegeben haben, wird der Schlüssel dadurch erzeugt. Die Werte "Left" und "Top" gibt es aber nach wie vor nicht und können deshalb auch nicht ausgelesen werden. In solchen Fällen löst die Laufzeitumgebung eine Exception (ERegistryException) aus. Am saubersten ist es, vor dem Lesen zu prüfen, ob der gewünschte Key existiert. Die Funktion "OpenKey" gibt true zurück, wenn der gewünschte Schlüssel vorhanden ist, ansonsten false. Das Vorhandensein einzelner Werte lässt sich mit "ValueExists" prüfen

Delphi-Quellcode:
var
  regist: TRegistry;
begin
  // Default-Werte setzen, falls Werte nicht in Registry vorhanden
  Form1.Left := 0;
  Form1.Top := 0;

  regist := TRegistry.Create;
  try
    regist.RootKey := HKEY_CURRENT_USER;
    if regist.OpenKey('Software\MeineFirma\MeinProgramm\1.0', false) then
    begin
      try
        // Prüfen, ob Wert "Left" vorhanden
        if regist.ValueExists('Left') then
          Form1.Left := regist.ReadInteger('Left');

        // Prüfen, ob Wert "Top" vorhanden
        if regist.ValueExists('Top') then
          Form1.Top := regist.ReadInteger('Top');
      finally
        regist.CloseKey;
      end;
    end;
  finally
    regist.Free;
  end;
end;
Besonderheiten bei Windows NT/2000/XP und neuer
Wie bereits erwähnt, können unter NT-Systemen nur Anwender mit Administrator-Rechten auf den HKEY_LOCAL_MACHINE-Schlüssel der Registry schreibend zugreifen. Wird also in einem Programm der Schreibzugriff auf diesen Schlüssel verwendet, sollte try-except verwendet werden, um ein mögliches Fehlschlagen abzufangen.

Auch das Lesen aus diesem Schlüssel ist unter NT nicht ganz problemlos. Über die oben vorgestellte Möglichkeit versucht Delphi immer, Vollzugriff (lesen und schreiben) zu erlangen. Ist das nicht möglich, weil ein NT-User keine Administrator-Rechte hat, tritt eine Exception auf. Da das Lesen von HKLM jedoch allen NT-Usern möglich ist, müssen wir Delphi klar machen, dass wir in diesem Fall keinen Vollzugriff, sondern nur Lesezugriff wollen. Das geht so:

regist := TRegistry.Create(KEY_READ);

Weitere Möglichkeiten zum Thema Zugriffsrechte sind in der Delphi-Hilfe unter TRegistry.Access zu finden.

Schöne Grüße aus Nürnberg,
Manfred
  Mit Zitat antworten Zitat
mz23
(Gast)

n/a Beiträge
 
#6

AW: Seriennummer Informationen in Registry schreiben

  Alt 6. Mär 2012, 07:10
...
Nachschlag:

Laß mal den BackSlash am Ende des Strings in OpenKey weg!

anstatt:
Delphi-Quellcode:

OpenKey('Software\DeveloperName\AppName\', True);
mach mal:

Delphi-Quellcode:

OpenKey('Software\DeveloperName\AppName', True);
auch:

Delphi-Quellcode:

WriteString('S/NR', MainConfig.SENR);
würde ich lieber so probieren:

Delphi-Quellcode:

WriteString('S-NR', MainConfig.SENR);
Schöne Grüße,
Manfred
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

AW: Seriennummer Informationen in Registry schreiben

  Alt 6. Mär 2012, 08:01
Auch sollte man den Rückgabewert von OpenKey testen und die Registry nur mit den absolut nötigen Rechten öffnen. Delphi öffnet die Registry immer mit allen Rechten. Besser ist es aber sie nur mit den wirklich benötigten Rechten zu öffnen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:09 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz