![]() |
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:
aber DWORDs?
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; 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:
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
RegistryKey reg = Registry.CurrentUser.CreateSubkey('Software\Testschlüssel');
System.UInt32 ui = 123456; reg.SetValue('Dword',(Int32)ui);
Delphi-Quellcode:
dann erzählt mir der Compiler, es gäbe keine Funktion von "SetValue", die ich so aufrufen könne. :cry:
var
ui : System.UInt32; begin { ... } ui := 123456; reg.SetValue('RegDword',Int32(ui)); { ... } end; Wo ist mein Fehler? |
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. |
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. |
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 |
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:
|
Re: Registry und DWORDs
Stimmt, ich überfliege alles. Und .NET und C# sagen mir immernoch nix ;)
|
Re: Registry und DWORDs
Mathias, keine Ahnung wo dein Problem ist:
Alle drei würden funktionieren...
Delphi-Quellcode:
Das ganze funktioniert auch ohne Umwege mit jedem Variablentyp, der mit Integer kompatibel ist (gerade getestet!)
reg.SetValue('DWORD_Val', Convert.ToInt32(ui));
reg.SetValue('DWORD_Val', Int32(ui)); reg.SetValue('DWORD_Val', ui); 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: |
Re: Registry und DWORDs
Das Problem ist, dass bei mir keine der 3 Anweisungen funktioniert. Und da ich abgesehen von dieser hier
Delphi-Quellcode:
selbst alle schon ausprobiert habe, schiebe ich´s jetzt einfach mal auf das noch fehlende Update #2 für Delphi 8.
reg.SetValue('DWORD_Val', Convert.ToInt32(ui));
|
Re: Registry und DWORDs
Moin...
Das klingt nach einem verdammt guten Argument sein D8 auf den neuesten Stand zu bringen. :mrgreen: |
Re: Registry und DWORDs
@Mathias: Dann mußte morgen mal mitkommen nach CB. Da kannste es dir dann selber saugen ;)
Olli |
Re: Registry und DWORDs
Haste nich´ ´ne Studentin, die das machen könnte? :mrgreen:
|
Re: Registry und DWORDs
Ne du, hab ich net, aber ich kann es nach wie vor. Nur leider brauch ich dazu was ...
|
Re: Registry und DWORDs
Uralter Beitrag, aktuelles Problem:
Zitat:
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? |
Re: Registry und DWORDs
Zitat:
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...) |
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:
|
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:
Edit: war wohl zu langsam, du hast es im anderen thread schon gelöst ;)
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; |
Re: Registry und DWORDs
Tja, ich bin ratlos. :(
Zitat:
Zitat:
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. |
Re: Registry und DWORDs
Zitat:
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 :? |
Re: Registry und DWORDs
Zitat:
Zitat:
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: |
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:
im Quelltext der Unit. In der Hilfe steht nichts dazu, aber
{$AUTOBOX ON}
![]() ![]() Zitat:
Nachzulesen ![]() 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. |
Re: Registry und DWORDs
Der wird bei mir autom. angelegt und machte bisher keine Probleme. :gruebel:
|
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? ;) |
Re: Registry und DWORDs
Zitat:
Delphi-Quellcode:
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
{$AUTOBOX ON}
Zitat:
So gesehen ein sehr sinniger Bugfix. :roll: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:43 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