![]() |
Kann mit RegQueryValueEx etc. in Delphi nicht umgehen
Tach zusammen.
Ich bin gerade bei dem Versuch, auf die Registry mit WinAPI-Funktionen zuzugreifen. Schlüssel öffnen klappt ja soweit ohne Probleme, aber beim Auslesen haperts. Ich benutze die Funktion RegQueryValueEX; der Rückgabewert zeigt mir an, dass es keinen Fehler gab. Allerdings hab ich in den Variablen, die ich laut PSDK zurückkriegen sollte, keine Werte gehabt. Ich hab mir die Funktionsimplementierung in der windows.pas mal angeschaut, und da siehts so aus:
Code:
Laut PSDK sind aber die letzten drei Variablen Referenzen und nicht nur Parameter, aber da müsste, zumindest anhand meiner ObjektPascal-Kenntnisse var vor dem Parameternamen gestellt sein. Da dies aber nicht der Fall ist, kann doch auch nach dem Funktionsaufruf kein Wert in den Variablen sein.
function RegQueryValueEx(hKey: HKEY; lpValueName: PChar;
lpReserved: Pointer; lpType: PDWORD; lpData: PByte; lpcbData: PDWORD): Longint; stdcall; Ich hoffe, so weit bin ich richtig. Wenn ja, dann frage ich mich, wie ich aus Delphi Werte aus der Registry lesen kann. Es wäre also wunderbar, wenn mich jemand aufklären würde, wie das geht bzw. kennt jemand vielleicht ein Delphi-Tutorial für die Registry mit der WinAPI? Im Notfall muss ich mir die registry.pas halt mal reinziehen und hoffen, dass ich sie versteh. Vielen Dank schon im Voraus. |
Hoi das hab ich aus dem EDH, allerdings ist das nicht direkt mit der WinAPI:
Zitat:
|
Leider nicht, was ich meinte
Danke für die Antwort, aber das ist leider nicht das, was ich gemeint hab. ich will die Registry-Funktionen der WinAPI benutzen, nicht die der TRegistry-Klasse, da die registry.pas meine EXE um knapp 50 kb aufbläht. Wenn schon nonVCL, dann richtig :D
|
:cry: Hab ich mir gedacht :(
|
Moin Chewie,
was die letzten drei Paramter angeht unterliegst Du einem Irrtum. Es werden die Adressen übergeben, und somit kann die Funktion an die Stelle auf die diese Pointer verweisen sehr wohl Daten schreiben. Du bräuchtest var nur, wenn diese Adresse geändert werden soll. Prinzipiell können bei API Funktionen alle Parameter als Const deklariert werden (mir fällt so auf Anhieb jedenfalls keine Ausnahme ein), da, für den Fall, dass die Funktion über einen der Parameter einen Wert zurückgeben soll dieser als Pointer deklariert ist. (siehe auch oben) Mal ein kleines stilisiertes Beispiel:
Code:
Die ganzen Initialisierungen habe ich weggelassen.
var
pBuffer : Pointer; dwValueType : DWord; dwBufferLen : DWord; hOpenKey : hKey; RegQueryValueEx(hOpenKey, PChar('VALUENAME'),nil,@dwValueType,pBuffer,@dwBufferLen) Kommst Du so damit klar? |
Klar. Ich denk immer noch von "normalen" Variablen und nicht von Pointern. Der Adressbereich bleibt ja konstant. OK. Soweit versteh ich die Funktion.
Jetzt hab ich das Problem, dass der Wert des Registry-Keys ja mit Hilfe des Pointers gespeichert ist. Da ich ja einen Allzweck-Pointer nicht dereferenzieren kann, muss ich ihn erstmal ain einen typisierten Pointer umwandeln und kann ihn dann dereferenzieren. Soweit die Theorie. DA ich aber heute zum ersten Mal überhaupt Pointern arbeite, hab ich keinen blassen Schimmer, wie ich das mache. Wie kann ich einen Pointer z. B. in einen Pointer auf einen String umwandeln? |
Moin Chewie,
da hast Du aber Glück, dass ich gerade an einem Reg Editor arbeite :mrgreen:
Code:
function RegDataToString(const p_dwRegDataType : DWord;const p_pValueData : Pointer;const p_dwDataLen : DWord) : string;
var pRegBinary : PByte; pRegDWord : PDWord; pRegString : PChar; pRegQWord : PInt64; i : DWord; begin Result := ''; case p_dwRegDataType of REG_BINARY, REG_MULTI_SZ, REG_NONE, REG_LINK, REG_RESOURCE_LIST, REG_FULL_RESOURCE_DESCRIPTOR, REG_RESOURCE_REQUIREMENTS_LIST : begin pRegBinary := p_pValueData; for i := 1 to p_dwDataLen do begin Result := Result + IntToHex(pRegBinary^,2)+#32; inc(pRegBinary); end; Result := trim(Result); end; REG_DWORD : begin pRegDWord := p_pValueData; Result := IntToHex(pRegDWord^,8) + ' ('+IntToStr(pRegDWord^)+'/'+IntToStr(integer(pRegDWord^))+')'; end; REG_DWORD_BIG_ENDIAN : begin pRegBinary := p_pValueData; for i := 1 to 4 do begin Result := Result + IntToHex(pRegBinary^,2); inc(pRegBinary); end; end; REG_EXPAND_SZ, REG_SZ : begin pRegString := p_pValueData; Result := pRegString; end; REG_QWORD : begin pRegQWord := p_pValueData; Result := IntToHex(pRegQWord^,16) + ' ('+IntToStr(pRegQWord^)+')'; end; end; end; |
Danke bisher für deine Geduld, aber es ist noch nicht vorbei... :(
Folgender Schnipsel ist für mich relevant: Zitat:
Also bei folgendem Code bekomme ich eine leere Box:
Code:
Der Typ und die Länge stimmen aber. Was hab ich falsch gemacht?
RegQueryValueEx(RegHnd, PChar('IsAlive'), nil, @dwValueType, pBuffer, @dwBufferLen);
ShowMessage(RegDatatoString(dwValueType, pBuffer, dwBufferLen)); P.S.: Wie es schon in der Sesamstraße heißt: Wer nicht fragt, bleibt dumm. :lol: |
Moin Chewie,
das kann ich mir nur so erklären, dass Du vergessen hast, den Buffer zu initialisieren, also z.B. pBuffer := AllocMem(100). Wenn der auf nil steht, dürftest Du das beschriebene Ergebnis erhalten. |
Das hatte ich wirklich nicht gemacht, aber auch so geht es nicht. Ich probier mal noch ein paar andere Wege aus, vielleicht finde ich dann Näheres über meinen Fehler.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:54 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