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/)
-   -   Delphi Wie kann ich das Registry mit API lesen und schreiben? (https://www.delphipraxis.net/286-wie-kann-ich-das-registry-mit-api-lesen-und-schreiben.html)

TopDogg 28. Jun 2002 19:27


Wie kann ich das Registry mit API lesen und schreiben?
 
Hi leute,
sehr gut hab ihr hier.
zuers aber danke an Luckie fuer den link in deiner page.

ich habe eine "dumme" frage.
wie kann ich einen string aus der registry lesen und in einem Edit-Text anzeigen und
aus einer ComboBox denn string rein schreiben?

ich weiss dass wenn ich luckies tutis noch mal durch arbeite und sehr viel denke das ich es dann auch hinkriege, aber ich hoffe das es hier schneller geht.
mir der VCL ist das lesen und schreiben kein thema, aber ich weiss leider nich wie ich den string aus der registry dem Edit-Tex zuweisen und den string aus der ComboBox in die registry schreiben kann.
wenn ihr mir weiter helfen koennt waehre net.
danke

Daniel 28. Jun 2002 19:32

Hallo toppDog ---> :cat:


fachlich kann ich Dir leider nicht weiterhelfen - aber ich kann Dir versichern, dass Deine Frage keineswegs "dumm" ist. Schliesslich ist ein Forum zum Fragen da!


Grüße aus Hamburg,
Daniel
Delphi-PRAXiS Administrator

Daniel B 28. Jun 2002 19:40

Zitat:

Zitat von Daniel
dass Deine Frage keineswegs "dumm" ist. Schliesslich ist ein Forum zum Fragen da!

So ist es. Da sieht man wieder was passiert wenn man in anderen Foren, die "anfänger" mit dummen Sprüchen abschmettert, wie, hast du denn die Tuts nciht gelesen, oder die Suche benutzt, du.......

Daniel 28. Jun 2002 19:47

@DanielB:
Schön, dass wir uns einig sind. Aber toppDog weiss immer noch nicht weiter :mrgreen:


Grüße,
Daniel

sakura 28. Jun 2002 20:03

Bevor ich mir jetzt das Leben schwer mache, wollte ich erst einmal fragen was das Problem genau ist.
  1. Zugriff auf die Registry ohne VCL mit API
  2. Übergeben eines Wertes an ein nonVCL Edit Feld / auslesen einer nonVCL Comobobox
:?:

:cat:

RomanK 28. Jun 2002 20:24

Zieh dir mal das rein http://www.delphipraxis.de/viewtopic.php?t=113 :mrgreen:

Daniel B 28. Jun 2002 20:25

Hier ist mal meine Prozedur um Daten aus der Reg zu Lesen. Ich lade sie aber in eine Stringlist und weise sie dann der einen Combo zu. Du musst es halt noch anpassen. Vielleicht bringts dir ja was.

Code:
procedure TEinstellungen.FormShow(Sender: TObject);
//ComPorts ermitteln und in ComboBox Anzeigen
var
  reg: TRegistry;
  st: TStrings;
  i: integer;
  ini: TIniFile;
  s: string;
begin
  ShowMessage('Bei änderungen, kann gleich mit den neuen Werten weiter gearbeitet'
    + #13 + 'werden. Das Programm muss nicht neu gestartet werden!');
  reg := TRegistry.Create;
  reg.RootKey := HKEY_LOCAL_MACHINE;
  reg.OpenKey('hardware\devicemap\serialcomm', False);
  st := TStringList.Create;
  reg.GetValueNames(st);
  ComboBoxPort.Items.Clear;
  for i := 0 to st.Count -1 do
    begin
      ComboBoxPort.Items.Add(reg.ReadString(st.Strings[i]));
    end;
  st.Free;
  reg.CloseKey;
  reg.free;
  if MainFormMC2004.ComPort.Port = 'COM1' then
  begin
    ComboBoxPort.ItemIndex := 0;
  end
  else if MainFormMC2004.ComPort.Port = 'COM2' then
  begin
    ComboBoxPort.ItemIndex := 1;
  end
  else if MainFormMC2004.ComPort.Port = 'COM3' then
  begin
    ComboBoxPort.ItemIndex := 2;
  end
  else if MainFormMC2004.ComPort.Port = 'COM4' then
  begin
    ComboBoxPort.ItemIndex := 3;
  end
  else if MainFormMC2004.ComPort.Port = 'COM5' then
  begin
    ComboBoxPort.ItemIndex := 4;
  end
  else if MainFormMC2004.ComPort.Port = 'COM6' then
  begin
    ComboBoxPort.ItemIndex := 5;
  end
  else if MainFormMC2004.ComPort.Port = 'COM7' then
  begin
    ComboBoxPort.ItemIndex := 6;
  end
  else if MainFormMC2004.ComPort.Port = 'COM8' then
  begin
    ComboBoxPort.ItemIndex := 7;
  end;
  ini:=TIniFile.Create(ChangeFileExt(ParamStr(0), '.ini'));
  try
    s := ini.ReadString('Einstellungen', 'Baud', '');
  finally
    ini.Free;
  end;
  if s = '2400' then
  begin
    ComboBoxBaud.ItemIndex := 0;
  end
  else if s = '4800' then
  begin
    ComboBoxBaud.ItemIndex := 1;
  end
  else if s = '9600' then
  begin
    ComboBoxBaud.ItemIndex := 2;
  end
  else if s = '14400' then
  begin
    ComboBoxBaud.ItemIndex := 3;
  end
  else if s = '19200' then
  begin
    ComboBoxBaud.ItemIndex := 4;
  end
  else if s = '28800' then
  begin
    ComboBoxBaud.ItemIndex := 5;
  end
  else if s = '38400' then
  begin
    ComboBoxBaud.ItemIndex := 6;
  end;  
end;

Christian Seehase 28. Jun 2002 20:28

Moin ToppDog,

hier hab' ich mal ein kleines Beispiel wie's gehen könnte.
Bislang nur mit gültigen Werten getestet, aber eigentlich sollten auch fehlerhafte Werte nur für entsprechende Rückgabewerte der Funktionen sorgen.

Code:
function WriteStringToRegAPI(const p_sSubKey : string;const p_sValueName : string;const p_sValue : string) : integer;

var
  hResult : HKEY;

begin
  // Es ginge auch RegOpenKeyEx, so wird ein nicht existenter Key aber angelegt.
  // Existiert der SubKey, wird er geöffnet
  Result := RegCreateKeyEx(HKEY_CURRENT_USER,PChar(p_sSubKey),0,nil,0,KEY_ALL_ACCESS,nil,hResult,nil);
  if Result <> ERROR_SUCCESS then
  begin
    exit;
  end;
  try
    Result := RegSetValueEx(hResult,PChar(p_sValueName),0,REG_SZ,@p_sValue[1],Length(p_sValue)+1);
  finally
    RegCloseKey(hResult);
  end;
end;

function ReadStringFromRegAPI(const p_sSubKey : string; const p_sValueName : string;var p_sResult : string) : integer;

var
  hResult      : HKEY;
  dwMaxValueLen : DWORD;
  szResult     : PChar;

begin
  Result := RegOpenKeyEx(HKEY_CURRENT_USER,PChar(p_sSubKey),0,KEY_ALL_ACCESS,hResult);
  if Result <> ERROR_SUCCESS then
  begin
    exit;
  end;
  try
    Result := RegQueryInfoKey(hResult,nil,nil,nil,nil,nil,nil,nil,nil,@dwMaxValueLen,nil,nil);
    if Result <> ERROR_SUCCESS then
    begin
      exit;
    end;
    inc(dwMaxValueLen);
    szResult := StrAlloc(dwMaxValueLen);
    try
      Result := RegQueryValueEx(hResult,PChar(p_sValueName),nil,nil,PByte(szResult),@dwMaxValueLen);
      if Result <> ERROR_SUCCESS then
      begin
        exit;
      end;
      p_sResult := trim(szResult);
    finally
      StrDispose(szResult);
    end;
  finally
    RegCloseKey(hResult);
  end;
end;
procedure TForm1.Button1Click(Sender: TObject);

var
  iResult : integer;
  sResult : string;

begin
  iResult := WriteStringToRegAPI('Software\CSE\TEST','TESTWERTNAME','TESTWERT');
  if iResult <> ERROR_SUCCESS then
  begin
    ShowMessage(SysErrorMessage(iResult));
  end;
  iResult := ReadStringFromRegAPI('Software\CSE\TEST','TESTWERTNAME',sResult);
  if iResult <> ERROR_SUCCESS then
  begin
    ShowMessage(SysErrorMessage(iResult));
  end
  else
  begin
    ShowMessage(sResult);
  end;
end;
Kommst Du damit klar?

@Mathias Simmack
Tut ist noch in Arbeit ;-)

RomanK 28. Jun 2002 20:28

@daniel B:
Er will es aber NonVcl!!!!!

Daniel B 28. Jun 2002 20:32

Zitat:

Zitat von Christian Seehase
Result := RegQueryInfoKey(hResult,nil,nil,nil,nil,nil,nil,ni l,nil,@dwMaxValueLen,nil,nil);

Kannst du mir das mal erklären bitte :?:

Daniel B 28. Jun 2002 20:33

Zitat:

Zitat von FuckRacism
@daniel B:
Er will es aber NonVcl!!!!!

oki, oki, entschuldigt :oops:

RomanK 28. Jun 2002 20:46

:twisted: :twisted: eieieieiei

Christian Seehase 28. Jun 2002 20:48

Moin Daniel B,

da zur Initialisierung des Buffers nur die maximale Länge eines Wertes interessant ist, frage ich auch nur den ab. Deshalb die ganzen nil Werte.
Das was man dort sonst noch in Erfahrung bringen kann spielt im gezeigten Zusammenhang einfach keine Rolle.

Code:
RegQueryInfoKey(
  hResult,       // Handle des abzufragenden Keys
  nil,           // Klasse des Keys
  nil,           // Bufferlänge für Klasse
  nil,           // Reserviert, muss nil sein
  nil,           // Anzahl der SubKeys des Keys
  nil,           // Maximale Länge eines Unterschlüssels
  nil,           // Maximale Länge eines Klassennamens von SubKeys
  nil,           // Anzahl der Werte des Keys
  nil,           // Maximale Länge eines Wertnamens
  @dwMaxValueLen, // Maximale Länge eines Wertes
  nil,           // Länge des Security Descriptors des Keys
  nil            // Datum letzte Änderung
);

Daniel B 28. Jun 2002 20:58

Zitat:

Zitat von Christian Seehase
da zur Initialisierung des Buffers nur die maximale Länge eines Wertes interessant ist, frage ich auch nur den ab. Deshalb die ganzen nil Werte. Das was man dort sonst noch in Erfahrung bringen kann spielt im gezeigten Zusammenhang einfach keine Rolle.

http://n-digital.info/Bilder/gator.gif Danke.

TopDogg 30. Jun 2002 23:40

Thanx
 
danke fuer die hilfe.

zuerst mal an sakura, jep das is was ich will.
ich will einen wert aus der Registry in ein Edit feld zeigen und dan einen wert aus der ComboBox in den Registry schreiben.


an Danile B.
mit VCL kann ich es ja auch aber dan wird meine .exe file leider 470 kb gorss und
ohne VCL 14 kb. nice, he.

an Christian,
danke fuer die function. ich werde sie ducharbeiten und weiter bearbeiten. vielen dank.

danke an alle fuer die antworten.

Luckie 1. Jul 2002 00:33

TRegistry kapselt ja nur die API-Registry-Funktionen, hat also in dem Sinne nichts mit der VCL zu tun, wie die Unit Forms. Und ich würde es auch nicht übetreiben, deswegen binde doch mal die Unit Registry ein und kuck wie groß dann deine Exe wird.

Habe es gerade mal gemacht:+ 42 KB. Also wenn du das noch vetreten kannst, dann würde ich nicht so einen Umstand machen und mich mit den API's rumschlagen. Man sollte realistisch bleiben. Oder anders gesagt: Man kann es mit dem nonVCL-Wahn auch übertreiben. Auf der anderen Seite sag ich mir aber auch: Wenn schon dann richtig :mrgreen:. Jetzt wieder spreche ich mich da zwar etwas, aber ich denke, ihr wißt, wie ich das meine.

MathiasSimmack 1. Jul 2002 07:01

Re: Thanx
 
Zitat:

Zitat von TopDogg
an Danile B.
mit VCL kann ich es ja auch aber dan wird meine .exe file leider 470 kb gorss

Nur, wenn du die Fenster usw. auch mit der VCL machst ...
Zitat:

und ohne VCL 14 kb. nice, he.
... Wenn du bei NonVCL bleibst und lediglich die Registry-Unit benutzt, dann dürfte dein Programm mit ca. 60-80k (oder 42k, wie Luckie schrieb) immer noch bedeutend kleiner sein als das VCL-Pendant.

Aber in dem Fall ist der direkte API-Zugriff natürlich vorzuziehen. Würde ich nicht anders machen. :-) Aber trotzdem ist es ja kein Widerspruch - es kommt eben immer auf die Situation an.

Christian Seehase 1. Jul 2002 09:56

Moin Zusammen,

ich habe mir jetzt nicht die gesamte TRegistry durchgesehen, aber spätestens wenn man Multistrings braucht (speziell beim Schreiben) hat man mit TRegistry verloren. Multistrings werden nicht davon unterstützt.

Luckie 1. Jul 2002 12:13

Was sind Multistrings?

Christian Seehase 1. Jul 2002 12:58

Moin Luckie,

das sind Stringlisten.
Jeder String ist nullterminiert, die gesamte Liste dann mit einer doppelten Null, so wie z.B. die Datei/Verzeichnislisten bei SHFileOperation.
(Bei Unicodestrings entsprechend die doppelte Anzahl von Nullen)
In RegEdit wird dieser Typ als REG_MULTI_SZ angezeigt.
Lesen kann man diesen meist mit TRegistry.ReadBinary, nur schreiben nicht.

TopDogg 1. Jul 2002 18:24

ok.

ihr habt warscheinlich rech mir dem "wahn".
40 kb sind auch nicht zu viel.
danke

machts gut


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