AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wert von RegSetValueEx

Ein Thema von me2u · begonnen am 4. Apr 2007 · letzter Beitrag vom 4. Apr 2007
Antwort Antwort
me2u
(Gast)

n/a Beiträge
 
#1

Wert von RegSetValueEx

  Alt 4. Apr 2007, 13:56
Hallo,

ich versuche mich gerade daran RegSetValueEx zu hooken. Dabei möchte ich den Wert (Parameter "lpValue"), der gesetzt wird als string an meine LogApplication senden. Allerdings weiß ich nicht, wie ich an den Inhalt von "lpValue" (Typ: PByte) kommen kann. Erstmal ist es ja immer ein unterschiedlicher Datentyp, d.h. ich mache eine Fallunterscheidung (case) nach dem Parameter "dwType".

Code:
 
  function ValueToStr(lpData: PByte): string;
  case dwType of
    REG_DWORD : Str(lpData^, Result);
    REG_SZ   : Result := lpData^;
    ...
und zweitens komme ich über den zeiger lpData immer nur an das erste Byte heran. Also meine Strings die ich übermittle bestehen immer nur aus dem ersten Character und meine Zahlen bewegen sich nur im Intervall 0 .. 255. Der Funktion RegSetValueEx wird aber auch noch der Parameter "cbData" (Typ: DWORD) übergeben, der der Grösse von "lpData" in Byte entspricht.
Habe schon versucht ihn mit an ValueToStr zu übergeben und ihn einzusetzen... nur ich weiß nicht wie.
Also wie kann ich einer Variablen den Speicherinhalt (referenziert durch "lpData") zuweisen?

MfG
Markus
  Mit Zitat antworten Zitat
Benutzerbild von ste_ett
ste_ett

Registriert seit: 10. Sep 2004
Ort: Dülmen
464 Beiträge
 
Delphi 7 Professional
 
#2

Re: Wert von RegSetValueEx

  Alt 4. Apr 2007, 14:37
Versuch mal dieses.

REG_SZ : Result := PChar(lpData); "lpData^" ist korekterweise auch nur ein Zeichen.
Stefan
"Geht nicht!" ist keine Fehlerbeschreibung und "Hab ich schon versucht!" keine Antwort!

Hey, it compiles! Ship it!
  Mit Zitat antworten Zitat
me2u
(Gast)

n/a Beiträge
 
#3

Re: Wert von RegSetValueEx

  Alt 4. Apr 2007, 15:05
oh... das is ja super wie schnell man hier eine Antwort bekommt

leider hilft das auch nichts... das Resultat besteht wieder nur aus dem ersten Zeichen. Ich vermute, dass es an dem Datentyp PBYTE (von "lpData") liegt.
Beispiel: Registryeintrag = "Lucida Console" (vom Typ REG_SZ), cbData = 30... mein String enthält nur "L"

Irgendwie muss man noch den Wert von "cbData" mit einbauen. Ich vermute dass cbData immer der (Länge des Eintrags + 1 Zeichen) * 2 entspricht. Das zusätzliche Zeichen wird Null sein, um den String abzuschliessen. Beim Registry-Datentyp REG_DWORD ist "cbData" übrigens immer 4.

Für Typ REG_SZ: Ist es nicht irgendwie möglich den Zeiger "lpData" immer ein Byte weiter zu setzen und dann das Zeichen im Speicher abzufragen? Wenn ja, dann hätte ich aber keine Ahnung wie es syntaktisch richtig aufgeschrieben würde.

kleiner Nachtrag:
So was in der Art, würde helfen (hatte ich mal versucht... verdeutlicht glaub ich eine Idee):

Delphi-Quellcode:
var s: string;
    i: DWORD
...
REG_DWORD: begin
             GetMem(@i, cbData) // konnte man so nicht schreiben
             @i := lpData; // der linken Seite kann nix zugewiesen werden
             Result := IntToStr(i);
           end;
REG_SZ: begin // Kommentare... siehe oben
          GetMem(@s, cbData);
          @s := lpData;
          Result := s;
        end;
...
Viele Grüsse
Markus
  Mit Zitat antworten Zitat
Benutzerbild von ste_ett
ste_ett

Registriert seit: 10. Sep 2004
Ort: Dülmen
464 Beiträge
 
Delphi 7 Professional
 
#4

Re: Wert von RegSetValueEx

  Alt 4. Apr 2007, 15:47
Hookst du "RegSetValueExA" oder "RegSetValueExW"?

Bei "RegSetValueExW" musst du statt "PChar()" einfach "PWideChar" nehmen.

- edit -

Zitat:
Beim Registry-Datentyp REG_DWORD ist "cbData" übrigens immer 4.
Das liegt daran, dass eine Variable vom Typ "DWORD" immer exakt vier Byte groß ist.
Stefan
"Geht nicht!" ist keine Fehlerbeschreibung und "Hab ich schon versucht!" keine Antwort!

Hey, it compiles! Ship it!
  Mit Zitat antworten Zitat
me2u
(Gast)

n/a Beiträge
 
#5

Re: Wert von RegSetValueEx

  Alt 4. Apr 2007, 16:09
super... da hätte ich ja auch mal selber drauf kommen können
Damit wäre der Typ REG_SZ schonmal geklärt... vielen Dank.

Aber wie funktioniert das ganze nun bei REG_DWORD?

Str(lpData^, Result); liefert immer nur Werte zw. 0 und 255.

und ein Typcast mittels DWORD() vor dem lpData^ liefert dasselbe Ergebnis.

Nachtrag:
Delphi-Quellcode:
   var b1, b2, b3, b4: Byte;
   ...
   REG_DWORD : begin
                 b1 := lpData^;
                 b2 := PByte(DWORD(lpData) + 1 * SizeOf(Byte))^;
                 b3 := PByte(DWORD(lpData) + 2 * SizeOf(Byte))^;
                 b4 := PByte(DWORD(lpData) + 3 * SizeOf(Byte))^;
                 Str(b1 + b2*256 + b3*65536 + b4*16777216, Result);
               end;
Dabei verlasse ich mich aber darauf, dass cbData beim Typ REG_DWORD immer 4 ist... was ja eigentlich auch der Fall sein müsste, oder? Ausserdem würde mich interessieren, ob es auch eine elegantere Lösung für das Problem gibt.

Dennoch einen herzlichen Dank an ste_ett für deine Hilfe.

Gruss Markus
  Mit Zitat antworten Zitat
Benutzerbild von ste_ett
ste_ett

Registriert seit: 10. Sep 2004
Ort: Dülmen
464 Beiträge
 
Delphi 7 Professional
 
#6

Re: Wert von RegSetValueEx

  Alt 4. Apr 2007, 17:24
Delphi-Quellcode:
var
  dwTemp: DWORD;
...

   REG_DWORD : begin
                 CopyMemory(@dwTemp, lpData, sizeof(DWORD)); // vier Byte in ein DWORD kopieren
                                                             // DWORD ist immer vier Byte groß
                 Str(dwTemp, Result);
               end;
Stefan
"Geht nicht!" ist keine Fehlerbeschreibung und "Hab ich schon versucht!" keine Antwort!

Hey, it compiles! Ship it!
  Mit Zitat antworten Zitat
me2u
(Gast)

n/a Beiträge
 
#7

Re: Wert von RegSetValueEx

  Alt 4. Apr 2007, 18:33
super... vielen dank!
  Mit Zitat antworten Zitat
Antwort Antwort


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 12:46 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