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 Schlüssel rekusiv löschen (https://www.delphipraxis.net/82851-schluessel-rekusiv-loeschen.html)

xZise 20. Dez 2006 17:50


Schlüssel rekusiv löschen
 
Wie kann ich einen Schlüssel rekusiv löschen ohne die VCL zu nutzen?

Ich habe da an "RegEnumKeyEx" gedacht, aber da hätte ich für jede Ebene eine neue Variable anlegen müssen.
Vielleicht stellt Windows etwas bereit?

marabu 20. Dez 2006 18:03

Re: Schlüssel rekusiv löschen
 
Hallo Fabian,

in der Tat stellt MS etwas bereit: Besorge dir aus dem JEDI Projekt eine Portierung vom Shell Lightweight API (SHLWAPI.DLL) und benutze daraus die Funktion SHDeleteKey().

Freundliche Grüße

Luckie 19. Mär 2007 22:08

Re: Schlüssel rekusiv löschen
 
Ich habe gerade versucht diese Funktion zu nutzen und in meine Registry Klasse eingebaut:

Delphi-Quellcode:
type
  TMpuRegistry = class(TObject)
  private
    FhkResult: HKEY;
    FMachine: PWideChar;
    FhKey: HKEY;
    function GetMachine: WideString;
    function GetHKey: HKEY;
  public
    constructor Create(const Machine: string; hKey: HKEY);
    constructor CreateW(const Machine: WideString; hKey: HKEY);
    destructor Destroy; override;
    function Connect: LongInt;
    function CreateKey(Root: HKEY; const SubKey: string): LongInt;
    function CreateKeyW(Root: HKEY; const SubKey: WideString): LongInt;
    function OpenKey(const SubKey: string; samDesired: REGSAM): LongInt;
    function OpenKeyW(const SubKey: WideString; samDesired: REGSAM): LongInt;
    function ReadInt(const ValueName: string; var Value: Integer): LongInt;
    function ReadIntW(const ValueName: WideString; var Value: Integer): LongInt;
    function ReadByte(const ValueName: string; var Value: Byte; default: Byte = 0): LongInt;
    function ReadByteW(const ValueName: WideString; var Value: Byte; default: Byte = 0): LongInt;
    function ReadBool(const ValueName: string; var Value: Boolean; default: Boolean = True): LongInt;
    function ReadBoolW(const ValueName: string; var Value: Boolean; default: Boolean = True): LongInt;
    function ReadString(const ValueName: string; var Value: string): LongInt;
    function ReadStringW(const ValueName: WideString; var Value: WideString): LongInt;
    function WriteInt(const ValueName: string; Value: Integer): LongInt;
    function WriteIntW(const ValueName: WideString; Value: Integer): LongInt;
    function WriteByte(const ValueName: string; Value: Byte): LongInt;
    function WriteByteW(const ValueName: WideString; Value: Byte): LongInt;
    function WriteBool(const ValueName: string; Value: Boolean): LongInt;
    function WriteBoolW(const ValueName: WideString; Value: Boolean): LongInt;
    function WriteString(const ValueName: string; Value: string): LongInt;
    function WriteStringW(const ValueName: WideString; const Value: WideString): LongInt;
    function DeleteValueName(const ValueName: string): LongInt;
    function DeleteSubKey(const SubKey: string): LongInt;
    function DeleteTree(const SubKey: String): Longint;
    property Machine: WideString read GetMachine;
    property hKey: HKEY read GetHKey;
  end;

implementation

function SHDeleteKey(key: HKEY; SubKey: LPCSTR): Integer; external 'shlwapi.dll' name 'SHDeleteKeyW';

//...;

function TMpuRegistry.DeleteTree(const SubKey: String): LongInt;
begin
  result := SHDeleteKey(FhkResult, PChar(SubKey));
end;
Aber ich bekomme eine AccessViolation nach dem Aufruf. Woran kann das liegen? FhkResult ist gültig.

Edit: Hmpf, es hat mal wieder das stdcall gefehlt. :wall:


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