Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Prism Registry und DWORDs (https://www.delphipraxis.net/21047-registry-und-dwords.html)

MathiasSimmack 27. Apr 2004 09:55


Registry und DWORDs
 
Hat jemand schon mal DWORDs und binäre Daten in der Registry gespeichert?
Also, Strings (REG_SZ) und Arrays (REG_MULTI_SZ) sind ja kein Thema:
Delphi-Quellcode:
procedure TWinForm.Button2_Click(sender: System.Object; e: System.EventArgs);
var
  reg : RegistryKey;
  arg : array of string;
begin
  try
    reg := Registry.CurrentUser.CreateSubKey('Software\Testschlüssel');
  except
    reg := nil;
  end;

  if(reg <> nil) then
  begin
    // REG_SZ
    reg.SetValue('RegSZ',string('Hallo, Welt!'));

    // REG_MULTI_SZ
    SetLength(arg,2);
    arg[0] := 'Hallo';
    arg[1] := 'Welt!';
    reg.SetValue('RegMultiSZ',arg);
    SetLength(arg,0);


    reg.Free;
  end;
end;
aber DWORDs?

Auf einer Seite (muss ich mal suchen :oops:) las ich, dass es beim Speichern von sehr großen Integer-Werten einen Bug im .NET-Framework geben soll. Als Workaround wurde das Typecasting als "Int32" empfohlen, was in C# (glaube ich) in etwa so aussah:
Code:
RegistryKey reg = Registry.CurrentUser.CreateSubkey('Software\Testschlüssel');
System.UInt32 ui = 123456;
reg.SetValue('Dword',(Int32)ui);
Is aus´m Kopf geschrieben, weil ich die Seite gerade nicht parat habe. Wie gesagt: Es ging auf der Seite eigentlich um einen Bug, aber zumindest sah ich damit einen Ansatz zum Speichern von DWORDs. Wenn ich allerdings versuche, dieses Prinzip in Delphi umzusetzen
Delphi-Quellcode:
var
  ui : System.UInt32;
begin
  { ... }

    ui := 123456;
    reg.SetValue('RegDword',Int32(ui));

  { ... }
end;
dann erzählt mir der Compiler, es gäbe keine Funktion von "SetValue", die ich so aufrufen könne. :cry:

Wo ist mein Fehler?

Assarbad 27. Apr 2004 10:57

Re: Registry und DWORDs
 
DWORDs sind Integers, Binärdaten muß man sich selber kümmern. Ich hab da auch ein Beispiel für jemanden in SL verfaßt gehabt, ich glaub hier war's drin:

http://assarbad.net/stuff/!export/regval.zip

Wenn nicht, schreib mir mal ne Mail. Resultat können wir ja trotzdem hier veröffentlichen.

MathiasSimmack 27. Apr 2004 12:15

Re: Registry und DWORDs
 
Nee, nee, @Assa. Das hat schon seinen Grund, warum es unter "Delphi .NET" steht. ;)

Ich rede in dem Fall vom Registry-Objekt, das vom .NET-Framework ("Microsoft.Win32"-Namespace) zur Verfügung gestellt wird. In einer WinForms-Anwendung, also nix mit VCL.NET. Nur der Vollständigkeit halber.

Assarbad 27. Apr 2004 12:20

Re: Registry und DWORDs
 
Wenn der Beitrag drüben in der rechten Navibar erscheint guck ich doch nicht auf die Rubrik ;)

Sprichst du eigentlich über die WMI-Klassen oder ist .NET nochmal komplett selbständig implementiert?

Olli

MathiasSimmack 27. Apr 2004 12:42

Re: Registry und DWORDs
 
Du kannst Fragen stellen. :oops: Das Registry-Objekt kommt, wie gesagt, aus dem "Microsoft.Win32"-Namespace und ist Teil des .NET-Framework. Ob dahinter nun noch mal WMI-Anweisungen stecken, das kann ich dir nicht sagen. Tut mir leid, aber so tief bin ich noch nicht in die Materie eingestiegen. ... Hatte ich auch nicht vor ... ;)


Edit:
Zitat:

Wenn der Beitrag drüben in der rechten Navibar erscheint guck ich doch nicht auf die Rubrik
Was aber auch der Beweis ist, dass du meinen Text nur überflogen hast. Da kommen nämlich die Zauberworte drin vor. :mrgreen:

Assarbad 27. Apr 2004 13:12

Re: Registry und DWORDs
 
Stimmt, ich überfliege alles. Und .NET und C# sagen mir immernoch nix ;)

Robert_G 28. Apr 2004 22:44

Re: Registry und DWORDs
 
Mathias, keine Ahnung wo dein Problem ist:
Alle drei würden funktionieren...
Delphi-Quellcode:
  reg.SetValue('DWORD_Val', Convert.ToInt32(ui));
  reg.SetValue('DWORD_Val', Int32(ui));
  reg.SetValue('DWORD_Val', ui);
Das ganze funktioniert auch ohne Umwege mit jedem Variablentyp, der mit Integer kompatibel ist (gerade getestet!)

Mit den UIntXX-Typen muss man in D8 vorsichtig umgehen, ich habe damit schon einige komische Dinge erlebt, die mit einem Integer oder IntXX nicht auftraten.

Edit: aus "Matthias" wurde "Mathias" :mrgreen:

MathiasSimmack 29. Apr 2004 06:00

Re: Registry und DWORDs
 
Das Problem ist, dass bei mir keine der 3 Anweisungen funktioniert. Und da ich abgesehen von dieser hier
Delphi-Quellcode:
reg.SetValue('DWORD_Val', Convert.ToInt32(ui));
selbst alle schon ausprobiert habe, schiebe ich´s jetzt einfach mal auf das noch fehlende Update #2 für Delphi 8.

Robert_G 29. Apr 2004 07:43

Re: Registry und DWORDs
 
Moin...
Das klingt nach einem verdammt guten Argument sein D8 auf den neuesten Stand zu bringen. :mrgreen:

Assarbad 29. Apr 2004 08:35

Re: Registry und DWORDs
 
@Mathias: Dann mußte morgen mal mitkommen nach CB. Da kannste es dir dann selber saugen ;)

Olli

MathiasSimmack 29. Apr 2004 09:10

Re: Registry und DWORDs
 
Haste nich´ ´ne Studentin, die das machen könnte? :mrgreen:

Assarbad 29. Apr 2004 10:23

Re: Registry und DWORDs
 
Ne du, hab ich net, aber ich kann es nach wie vor. Nur leider brauch ich dazu was ...

MathiasSimmack 15. Jun 2004 21:06

Re: Registry und DWORDs
 
Uralter Beitrag, aktuelles Problem:
Zitat:

Zitat von Robert_G
Das klingt nach einem verdammt guten Argument sein D8 auf den neuesten Stand zu bringen. :mrgreen:

Wenn es was bringen würde, dann wär´s noch besser. :cry:

Soll heißen: Ich habe mir das D8 Update #2 besorgt und installiert. Das Schreiben von DWords in die Registry nach dem o.g. Muster geht bei mir (D8 Pro) nach wie vor nicht. Ich bin erstaunt, dass es bei dir geklappt hat. Sollen die Unterschiede zwischen Pro- und Architektversion wirklich so groß sein?

Robert_G 16. Jun 2004 08:36

Re: Registry und DWORDs
 
Zitat:

Sollen die Unterschiede zwischen Pro- und Architektversion wirklich so groß sein?
Das glaube ich weniger. ;)
Da ich schon oft Problemchen mit lokalisierter Software hatte, besorge ich mir immer das Original. Im englischen D8 klappte es einwandfrei. (Ich teste es gleich nochmal...)

MathiasSimmack 16. Jun 2004 08:48

Re: Registry und DWORDs
 
Ich bin dir ja dankbar für deine Hilfe, und nimm´s bitte nicht persönlich ... aber wo siehst du denn hier:
Zitat:

Zitat von Robert_G
Delphi-Quellcode:
  reg.SetValue('DWORD_Val', Convert.ToInt32(ui));
  reg.SetValue('DWORD_Val', Int32(ui));
  reg.SetValue('DWORD_Val', ui);

Probleme mit der Lokalisierung? Das würde ja bedeuten, dass deutsche Borland-Team hat enorm in die Interna eingegriffen.

Robert_G 16. Jun 2004 09:11

Re: Registry und DWORDs
 
Liste der Anhänge anzeigen (Anzahl: 1)
Viele lokalisierte Programme bocken oft an Stellen, wo man es nicht vermutet (sonst wäre der Fehler schon früher gefunden worden ;) )

Zum Thema:
Es funktioniert einwandfrei.
Ich habe eben schnell was zusammengeklickt. Mit dem Schnipsel bekommst du den Wert und den Typ (dürfte in dem Fall immer Int32 sein ;) )

Delphi-Quellcode:
procedure TfrmTestReg.btnWrite_Click(sender: System.Object; e: System.EventArgs);
var
  reg :RegistryKey;
begin
  reg := Registry.CurrentUser.OpenSubKey('Software\TestReg', true);
  if txtRegWrite.Text.Trim = '' then
    reg.SetValue('Miep' , Int32.Parse(txtRegRead.Text))
  else
    reg.SetValue(txtRegWrite.Text.Trim , Int32.Parse(txtRegRead.Text.Trim));
end;

procedure TfrmTestReg.btnRead_Click(sender: System.Object; e: System.EventArgs);
var
  reg :RegistryKey;
  FetchedObj :System.Object;
begin
  reg := Registry.CurrentUser.OpenSubKey('Software\TestReg', false);
  if txtRegWrite.Text.Trim = '' then
    FetchedObj := reg.GetValue('Miep' , -1)
  else
    FetchedObj := reg.GetValue(txtRegWrite.Text.Trim , -1);

  txtRegRead.Text := FetchedObj.ToString;
  if FetchedObj.ToString <> '' then
    lblRegType.Text := FetchedObj.GetType.ToString
  else
    lblRegType.Text := '(null)';
end;
Edit: war wohl zu langsam, du hast es im anderen thread schon gelöst ;)

MathiasSimmack 16. Jun 2004 11:45

Re: Registry und DWORDs
 
Tja, ich bin ratlos. :(

Zitat:

Zitat von Robert_G
Es funktioniert einwandfrei.

Nicht bei mir.

Zitat:

Delphi-Quellcode:
procedure TfrmTestReg.btnWrite_Click(sender: System.Object; e: System.EventArgs);
var
  reg :RegistryKey;
begin
  reg := Registry.CurrentUser.OpenSubKey('Software\TestReg', true);
  if txtRegWrite.Text.Trim = '' then
    reg.SetValue('Miep' , Int32.Parse(txtRegRead.Text))
  else
    reg.SetValue(txtRegWrite.Text.Trim , Int32.Parse(txtRegRead.Text.Trim));
end;

scheitert nach wie vor an der Fehlermeldung: Es gibt keine Version von "SetValue", die man so aufrufen kann.

Ob bitte mal andere stolze (?) Besitzer von Delphi 8 Professional ausprobieren könnten, ob der o.g. Code funktioniert? Bei mir geht´s nicht. Der "Microsoft.Win32"-Namespaces muss unter uses eingebunden werden.

Robert_G 16. Jun 2004 12:11

Re: Registry und DWORDs
 
Zitat:

Zitat von MathiasSimmack
...scheitert nach wie vor an der Fehlermeldung: Es gibt keine Version von "SetValue", die man so aufrufen kann.

:?:

Der 2. Parameter von SetValue ist ein System.Object. Davon werden ALLE typen und Klassen abgeleitet (sogar Arrays!).
Ein Int32 sollte also IMMER passen...

there smells something extremely rotten in state of Borland :?

MathiasSimmack 16. Jun 2004 12:33

Re: Registry und DWORDs
 
Zitat:

Zitat von Robert_G
Der 2. Parameter von SetValue ist ein System.Object. Davon werden ALLE typen und Klassen abgeleitet (sogar Arrays!).

Ja, ich weiß. Und wie auf Seite #1 geschrieben: Bei Strings und String-Arrays habe ich absolut keine Probleme.

Zitat:

Ein Int32 sollte also IMMER passen...
Ich glaube dir ja. ;) Nur entweder mache ich was falsch (obwohl: Copy&Paste ... :?), oder ich habe eine besch**** Delphi-Version erwischt, oder die Pro-Version hat generell ein Problem damit. Darum ja auch die Frage an andere D8-Besitzer. @Alexander, Chakotay: Wo seid ihr?

Na ja, ich schreib mal eben eine Mail an den Kundendienst. Wenn die die Post wieder ignorieren, wie damals die Pienitz (oder wie die heißt), dann muss ich mal schauen wie man die Aufmerksamkeit von Borland bekommen kann. :evil:

MathiasSimmack 16. Jun 2004 14:53

Re: Registry und DWORDs
 
Gut, Problem erkannt; Gefahr gebannt.
Im DF schrieb ich gerade
Mensch, das war ein Krampf. Ich weiß jetzt warum es nicht ging. Oder sagen wir: Ich kenne die Ursache. Es gibt standardmäßig eine nicht dokumentierte Compileroption
Delphi-Quellcode:
{$AUTOBOX ON}
im Quelltext der Unit. In der Hilfe steht nichts dazu, aber Bei Google suchenGoogle brachte mich u.a. auf diese Seite, wo folgendes steht:
Zitat:

In the {$AUTOBOX ON} state, a simple type is compatible with that simple type, and TObject itself. Also, in a call to a procedure with an interface type parameter, an object is compatible with only any interface types it implements, provided that the declared procedure is not overloaded.

Nachzulesen hier.

Damit hätte sich das technische Problem zwar gelöst, aber dennoch bleibt ein bitterer Beigeschmack.
Ich schätze, da wird eine weitere Mail an den Kundendienst fällig werden.

Robert_G 16. Jun 2004 15:24

Re: Registry und DWORDs
 
Der wird bei mir autom. angelegt und machte bisher keine Probleme. :gruebel:

MathiasSimmack 16. Jun 2004 15:58

Re: Registry und DWORDs
 
Ja, ich habe mich auch schon am Kopf gekratzt und mich gefragt ob ich den Eintrag vielleicht versehentlich entfernt habe. Aber ... nach langem Überlegen sage ich mal: Nein! Bei Delphi 5 oder 7, okay - da kenne ich mich im Unitformat aus und entferne was ich IMHO nicht brauche. Aber vor D8-Units habe ich dann doch etwas mehr Respekt.

Na ja, egal.
Zumindest kann ich jetzt erst mal weitermachen.

Wie war das mit dem Blutdruck? ;)

MathiasSimmack 16. Jun 2004 20:31

Re: Registry und DWORDs
 
Zitat:

Zitat von MathiasSimmack
Ja, ich habe mich auch schon am Kopf gekratzt und mich gefragt ob ich den Eintrag vielleicht versehentlich entfernt habe.

Inzwischen weiß ich es definitiv: Nein! Ich habe mir gerade mal meine ersten .NET-Versuche auf meiner CD angeschaut, und keiner enthielt diesen Compilerschalter
Delphi-Quellcode:
{$AUTOBOX ON}
Ich schätze also, das Update #2 sorgt dafür, dass bei neuen Projekten die Option automatisch ergänzt wird. Allerdings eben nicht bei alten Quellcodes. Und wenn man das nicht weiß, dann kann man natürlich auch sehr lange rätseln warum etwas nicht funktioniert. Meine Aussage
Zitat:

Und da ich [...] selbst alle schon ausprobiert habe, schiebe ich´s jetzt einfach mal auf das noch fehlende Update #2 für Delphi 8.
stimmt damit zwar, allerdings sollte man das eben wissen, damit man ggf. alte Projekte anpassen kann.

So gesehen ein sehr sinniger Bugfix. :roll:


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:32 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