|
@@ -39,6 +39,8 @@ type
|
|
|
DataSize: Integer;
|
|
|
end;
|
|
|
|
|
|
+ TUnicodeStringArray = Array of UnicodeString;
|
|
|
+
|
|
|
{ ---------------------------------------------------------------------
|
|
|
TRegistry
|
|
|
---------------------------------------------------------------------}
|
|
@@ -54,21 +56,30 @@ type
|
|
|
fCurrentKey: HKEY;
|
|
|
fRootKey: HKEY;
|
|
|
fLazyWrite: Boolean;
|
|
|
- fCurrentPath: string;
|
|
|
+ fCurrentPath: UnicodeString;
|
|
|
function GetLastErrorMsg: string;
|
|
|
+ function RegMultiSzDataToUnicodeStringArray(U: UnicodeString): TUnicodeStringArray;
|
|
|
+ function ListToArray(List: TStrings; IsUtf8: Boolean): TUnicodeStringArray;
|
|
|
+ procedure ArrayToList(const Arr: TUnicodeStringArray; List: TStrings; ForceUtf8: Boolean);
|
|
|
procedure SetRootKey(Value: HKEY);
|
|
|
Procedure SysRegCreate;
|
|
|
Procedure SysRegFree;
|
|
|
- Function SysGetData(const Name: String; Buffer: Pointer; BufSize: Integer; Out RegData: TRegDataType): Integer;
|
|
|
- Function SysPutData(const Name: string; Buffer: Pointer; BufSize: Integer; RegData: TRegDataType) : Boolean;
|
|
|
- Function SysCreateKey(const Key: String): Boolean;
|
|
|
+ Function SysGetData(const Name: UnicodeString; Buffer: Pointer; BufSize: Integer; Out RegData: TRegDataType): Integer;
|
|
|
+ Function SysPutData(const Name: UnicodeString; Buffer: Pointer; BufSize: Integer; RegData: TRegDataType) : Boolean;
|
|
|
+ Function SysCreateKey(Key: UnicodeString): Boolean;
|
|
|
protected
|
|
|
function GetBaseKey(Relative: Boolean): HKey;
|
|
|
- function GetData(const Name: string; Buffer: Pointer;
|
|
|
+ function GetData(const Name: UnicodeString; Buffer: Pointer;
|
|
|
+ BufSize: Integer; Out RegData: TRegDataType): Integer;
|
|
|
+ function GetData(const Name: String; Buffer: Pointer;
|
|
|
BufSize: Integer; Out RegData: TRegDataType): Integer;
|
|
|
- function GetKey(const Key: string): HKEY;
|
|
|
- procedure ChangeKey(Value: HKey; const Path: string);
|
|
|
- procedure PutData(const Name: string; Buffer: Pointer;
|
|
|
+ function GetKey(Key: UnicodeString): HKEY;
|
|
|
+ function GetKey(Key: String): HKEY;
|
|
|
+ procedure ChangeKey(Value: HKey; const Path: UnicodeString);
|
|
|
+ procedure ChangeKey(Value: HKey; const Path: String);
|
|
|
+ procedure PutData(const Name: UnicodeString; Buffer: Pointer;
|
|
|
+ BufSize: Integer; RegData: TRegDataType);
|
|
|
+ procedure PutData(const Name: String; Buffer: Pointer;
|
|
|
BufSize: Integer; RegData: TRegDataType);
|
|
|
procedure SetCurrentKey(Value: HKEY);
|
|
|
public
|
|
@@ -76,58 +87,105 @@ type
|
|
|
constructor Create(aaccess:longword); overload;
|
|
|
destructor Destroy; override;
|
|
|
|
|
|
- function CreateKey(const Key: string): Boolean;
|
|
|
- function DeleteKey(const Key: string): Boolean;
|
|
|
- function DeleteValue(const Name: string): Boolean;
|
|
|
- function GetDataInfo(const ValueName: string; Out Value: TRegDataInfo): Boolean;
|
|
|
- function GetDataSize(const ValueName: string): Integer;
|
|
|
- function GetDataType(const ValueName: string): TRegDataType;
|
|
|
+ function CreateKey(const Key: UnicodeString): Boolean;
|
|
|
+ function CreateKey(const Key: String): Boolean;
|
|
|
+ function DeleteKey(const Key: UnicodeString): Boolean;
|
|
|
+ function DeleteKey(const Key: String): Boolean;
|
|
|
+ function DeleteValue(const Name: UnicodeString): Boolean;
|
|
|
+ function DeleteValue(const Name: String): Boolean;
|
|
|
+ function GetDataInfo(const ValueName: UnicodeString; Out Value: TRegDataInfo): Boolean;
|
|
|
+ function GetDataInfo(const ValueName: String; Out Value: TRegDataInfo): Boolean;
|
|
|
+ function GetDataSize(const ValueName: UnicodeString): Integer;
|
|
|
+ function GetDataSize(const ValueName: String): Integer;
|
|
|
+ function GetDataType(const ValueName: UnicodeString): TRegDataType;
|
|
|
+ function GetDataType(const ValueName: String): TRegDataType;
|
|
|
function GetKeyInfo(Out Value: TRegKeyInfo): Boolean;
|
|
|
function HasSubKeys: Boolean;
|
|
|
- function KeyExists(const Key: string): Boolean;
|
|
|
- function LoadKey(const Key, FileName: string): Boolean;
|
|
|
- function OpenKey(const Key: string; CanCreate: Boolean): Boolean;
|
|
|
- function OpenKeyReadOnly(const Key: string): Boolean;
|
|
|
- function ReadCurrency(const Name: string): Currency;
|
|
|
- function ReadBinaryData(const Name: string; var Buffer; BufSize: Integer): Integer;
|
|
|
- function ReadBool(const Name: string): Boolean;
|
|
|
- function ReadDate(const Name: string): TDateTime;
|
|
|
- function ReadDateTime(const Name: string): TDateTime;
|
|
|
- function ReadFloat(const Name: string): Double;
|
|
|
- function ReadInteger(const Name: string): Integer;
|
|
|
- function ReadInt64(const Name: string): Int64;
|
|
|
- function ReadString(const Name: string): string;
|
|
|
- procedure ReadStringList(const Name: string; AList: TStrings);
|
|
|
- function ReadTime(const Name: string): TDateTime;
|
|
|
- function RegistryConnect(const UNCName: string): Boolean;
|
|
|
- function ReplaceKey(const Key, FileName, BackUpFileName: string): Boolean;
|
|
|
- function RestoreKey(const Key, FileName: string): Boolean;
|
|
|
- function SaveKey(const Key, FileName: string): Boolean;
|
|
|
- function UnLoadKey(const Key: string): Boolean;
|
|
|
- function ValueExists(const Name: string): Boolean;
|
|
|
+ function KeyExists(const Key: UnicodeString): Boolean;
|
|
|
+ function KeyExists(const Key: String): Boolean;
|
|
|
+ function LoadKey(const Key, FileName: UnicodeString): Boolean;
|
|
|
+ function LoadKey(const Key, FileName: String): Boolean;
|
|
|
+ function OpenKey(const Key: UnicodeString; CanCreate: Boolean): Boolean;
|
|
|
+ function OpenKey(const Key: String; CanCreate: Boolean): Boolean;
|
|
|
+ function OpenKeyReadOnly(const Key: UnicodeString): Boolean;
|
|
|
+ function OpenKeyReadOnly(const Key: String): Boolean;
|
|
|
+ function ReadCurrency(const Name: UnicodeString): Currency;
|
|
|
+ function ReadCurrency(const Name: String): Currency;
|
|
|
+ function ReadBinaryData(const Name: UnicodeString; var Buffer; BufSize: Integer): Integer;
|
|
|
+ function ReadBinaryData(const Name: String; var Buffer; BufSize: Integer): Integer;
|
|
|
+ function ReadBool(const Name: UnicodeString): Boolean;
|
|
|
+ function ReadBool(const Name: String): Boolean;
|
|
|
+ function ReadDate(const Name: UnicodeString): TDateTime;
|
|
|
+ function ReadDate(const Name: String): TDateTime;
|
|
|
+ function ReadDateTime(const Name: UnicodeString): TDateTime;
|
|
|
+ function ReadDateTime(const Name: String): TDateTime;
|
|
|
+ function ReadFloat(const Name: UnicodeString): Double;
|
|
|
+ function ReadFloat(const Name: String): Double;
|
|
|
+ function ReadInteger(const Name: UnicodeString): Integer;
|
|
|
+ function ReadInteger(const Name: String): Integer;
|
|
|
+ function ReadInt64(const Name: UnicodeString): Int64;
|
|
|
+ function ReadInt64(const Name: String): Int64;
|
|
|
+ function ReadString(const Name: UnicodeString): UnicodeString;
|
|
|
+ function ReadString(const Name: String): string;
|
|
|
+ procedure ReadStringList(const Name: UnicodeString; AList: TStrings; ForceUtf8: Boolean=False);
|
|
|
+ procedure ReadStringList(const Name: String; AList: TStrings);
|
|
|
+ function ReadStringArray(const Name: UnicodeString): TUnicodeStringArray;
|
|
|
+ function ReadStringArray(const Name: String): TStringArray;
|
|
|
+ function ReadTime(const Name: UnicodeString): TDateTime;
|
|
|
+ function ReadTime(const Name: String): TDateTime;
|
|
|
+ function RegistryConnect(const UNCName: UnicodeString): Boolean;
|
|
|
+ function RegistryConnect(const UNCName: String): Boolean;
|
|
|
+ function ReplaceKey(const Key, FileName, BackUpFileName: UnicodeString): Boolean;
|
|
|
+ function ReplaceKey(const Key, FileName, BackUpFileName: String): Boolean;
|
|
|
+ function RestoreKey(const Key, FileName: UnicodeString): Boolean;
|
|
|
+ function RestoreKey(const Key, FileName: String): Boolean;
|
|
|
+ function SaveKey(const Key, FileName: UnicodeString): Boolean;
|
|
|
+ function SaveKey(const Key, FileName: String): Boolean;
|
|
|
+ function UnLoadKey(const Key: UnicodeString): Boolean;
|
|
|
+ function UnLoadKey(const Key: String): Boolean;
|
|
|
+ function ValueExists(const Name: UnicodeString): Boolean;
|
|
|
+ function ValueExists(const Name: String): Boolean;
|
|
|
|
|
|
procedure CloseKey;
|
|
|
procedure CloseKey(key:HKEY);
|
|
|
procedure GetKeyNames(Strings: TStrings);
|
|
|
+ function GetKeyNames: TUnicodeStringArray;
|
|
|
procedure GetValueNames(Strings: TStrings);
|
|
|
- procedure MoveKey(const OldName, NewName: string; Delete: Boolean);
|
|
|
- procedure RenameValue(const OldName, NewName: string);
|
|
|
- procedure WriteCurrency(const Name: string; Value: Currency);
|
|
|
- procedure WriteBinaryData(const Name: string; var Buffer; BufSize: Integer);
|
|
|
- procedure WriteBool(const Name: string; Value: Boolean);
|
|
|
- procedure WriteDate(const Name: string; Value: TDateTime);
|
|
|
- procedure WriteDateTime(const Name: string; Value: TDateTime);
|
|
|
- procedure WriteFloat(const Name: string; Value: Double);
|
|
|
- procedure WriteInteger(const Name: string; Value: Integer);
|
|
|
- procedure WriteInt64(const Name: string; Value: Int64);
|
|
|
- procedure WriteString(const Name, Value: string);
|
|
|
- procedure WriteExpandString(const Name, Value: string);
|
|
|
- procedure WriteStringList(const Name: string; List: TStrings);
|
|
|
- procedure WriteTime(const Name: string; Value: TDateTime);
|
|
|
+ //ToDo
|
|
|
+ function GetValueNames: TUnicodeStringArray;
|
|
|
+ procedure MoveKey(const OldName, NewName: UnicodeString; Delete: Boolean);
|
|
|
+ procedure MoveKey(const OldName, NewName: String; Delete: Boolean);
|
|
|
+ procedure RenameValue(const OldName, NewName: UnicodeString);
|
|
|
+ procedure RenameValue(const OldName, NewName: String);
|
|
|
+ procedure WriteCurrency(const Name: UnicodeString; Value: Currency);
|
|
|
+ procedure WriteCurrency(const Name: String; Value: Currency);
|
|
|
+ procedure WriteBinaryData(const Name: UnicodeString; var Buffer; BufSize: Integer);
|
|
|
+ procedure WriteBinaryData(const Name: String; var Buffer; BufSize: Integer);
|
|
|
+ procedure WriteBool(const Name: UnicodeString; Value: Boolean);
|
|
|
+ procedure WriteBool(const Name: String; Value: Boolean);
|
|
|
+ procedure WriteDate(const Name: UnicodeString; Value: TDateTime);
|
|
|
+ procedure WriteDate(const Name: String; Value: TDateTime);
|
|
|
+ procedure WriteDateTime(const Name: UnicodeString; Value: TDateTime);
|
|
|
+ procedure WriteDateTime(const Name: String; Value: TDateTime);
|
|
|
+ procedure WriteFloat(const Name: UnicodeString; Value: Double);
|
|
|
+ procedure WriteFloat(const Name: String; Value: Double);
|
|
|
+ procedure WriteInteger(const Name: UnicodeString; Value: Integer);
|
|
|
+ procedure WriteInteger(const Name: String; Value: Integer);
|
|
|
+ procedure WriteInt64(const Name: UnicodeString; Value: Int64);
|
|
|
+ procedure WriteInt64(const Name: String; Value: Int64);
|
|
|
+ procedure WriteString(const Name, Value: UnicodeString);
|
|
|
+ procedure WriteString(const Name, Value: String);
|
|
|
+ procedure WriteExpandString(const Name, Value: UnicodeString);
|
|
|
+ procedure WriteExpandString(const Name, Value: String);
|
|
|
+ procedure WriteStringList(const Name: UnicodeString; List: TStrings; IsUtf8: Boolean=False);
|
|
|
+ procedure WriteStringArray(const Name: UnicodeString; const Arr: TUnicodeStringArray);
|
|
|
+ procedure WriteStringArray(const Name: String; const Arr: TStringArray);
|
|
|
+ procedure WriteTime(const Name: UnicodeString; Value: TDateTime);
|
|
|
+ procedure WriteTime(const Name: String; Value: TDateTime);
|
|
|
|
|
|
property Access: LongWord read fAccess write fAccess;
|
|
|
property CurrentKey: HKEY read fCurrentKey;
|
|
|
- property CurrentPath: string read fCurrentPath;
|
|
|
+ property CurrentPath: UnicodeString read fCurrentPath;
|
|
|
property LazyWrite: Boolean read fLazyWrite write fLazyWrite;
|
|
|
property RootKey: HKEY read fRootKey write SetRootKey;
|
|
|
Property StringSizeIncludesNull : Boolean read FStringSizeIncludesNull;
|
|
@@ -235,6 +293,16 @@ implementation
|
|
|
Generic, implementation-independent code.
|
|
|
---------------------------------------------------------------------}
|
|
|
|
|
|
+{$ifdef DebugRegistry}
|
|
|
+function DbgS(const S: UnicodeString): String;
|
|
|
+var
|
|
|
+ C: WideChar;
|
|
|
+begin
|
|
|
+ Result := '';
|
|
|
+ for C in S do Result := Result + IntToHex(Word(C),4) + #32;
|
|
|
+ Result := TrimRight(Result);
|
|
|
+end;
|
|
|
+{$endif}
|
|
|
|
|
|
constructor TRegistry.Create;
|
|
|
|
|
@@ -261,7 +329,7 @@ begin
|
|
|
inherited Destroy;
|
|
|
end;
|
|
|
|
|
|
-function TRegistry.CreateKey(const Key: string): Boolean;
|
|
|
+function TRegistry.CreateKey(const Key: UnicodeString): Boolean;
|
|
|
|
|
|
begin
|
|
|
Result:=SysCreateKey(Key);
|
|
@@ -269,6 +337,27 @@ begin
|
|
|
Raise ERegistryException.CreateFmt(SRegCreateFailed, [Key]);
|
|
|
end;
|
|
|
|
|
|
+function TRegistry.CreateKey(const Key: String): Boolean;
|
|
|
+begin
|
|
|
+ Result:=CreateKey(UnicodeString(Key));
|
|
|
+end;
|
|
|
+
|
|
|
+function TRegistry.DeleteKey(const Key: String): Boolean;
|
|
|
+begin
|
|
|
+ Result:=DeleteKey(UnicodeString(Key));
|
|
|
+end;
|
|
|
+
|
|
|
+function TRegistry.DeleteValue(const Name: String): Boolean;
|
|
|
+begin
|
|
|
+ Result:=DeleteValue(UnicodeString(Name));
|
|
|
+end;
|
|
|
+
|
|
|
+function TRegistry.GetDataInfo(const ValueName: String; out Value: TRegDataInfo
|
|
|
+ ): Boolean;
|
|
|
+begin
|
|
|
+ Result:=GetDataInfo(UnicodeString(ValueName), Value);
|
|
|
+end;
|
|
|
+
|
|
|
function TRegistry.GetBaseKey(Relative: Boolean): HKey;
|
|
|
begin
|
|
|
If Relative and (CurrentKey<>0) Then
|
|
@@ -277,14 +366,31 @@ begin
|
|
|
Result := RootKey;
|
|
|
end;
|
|
|
|
|
|
-function TRegistry.GetData(const Name: string; Buffer: Pointer; BufSize: Integer; out RegData: TRegDataType): Integer;
|
|
|
+function TRegistry.GetData(const Name: UnicodeString; Buffer: Pointer; BufSize: Integer; out RegData: TRegDataType): Integer;
|
|
|
begin
|
|
|
Result:=SysGetData(Name,Buffer,BufSize,RegData);
|
|
|
If (Result=-1) then
|
|
|
Raise ERegistryException.CreateFmt(SRegGetDataFailed, [Name]);
|
|
|
end;
|
|
|
|
|
|
-procedure TRegistry.PutData(const Name: string; Buffer: Pointer;
|
|
|
+function TRegistry.GetData(const Name: String; Buffer: Pointer;
|
|
|
+ BufSize: Integer; out RegData: TRegDataType): Integer;
|
|
|
+begin
|
|
|
+ Result:=GetData(UnicodeString(Name), Buffer, BufSize, RegData);
|
|
|
+end;
|
|
|
+
|
|
|
+function TRegistry.GetKey(Key: String): HKEY;
|
|
|
+begin
|
|
|
+ Result:=GetKey(UnicodeString(Key));
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TRegistry.ChangeKey(Value: HKey; const Path: String);
|
|
|
+begin
|
|
|
+ ChangeKey(Value, UnicodeString(Path));
|
|
|
+end;
|
|
|
+
|
|
|
+
|
|
|
+procedure TRegistry.PutData(const Name: UnicodeString; Buffer: Pointer;
|
|
|
BufSize: Integer; RegData: TRegDataType);
|
|
|
|
|
|
begin
|
|
@@ -292,8 +398,14 @@ begin
|
|
|
Raise ERegistryException.CreateFmt(SRegSetDataFailed, [Name]);
|
|
|
end;
|
|
|
|
|
|
+procedure TRegistry.PutData(const Name: String; Buffer: Pointer;
|
|
|
+ BufSize: Integer; RegData: TRegDataType);
|
|
|
+begin
|
|
|
+ PutData(UnicodeString(Name), Buffer, BufSize, RegData);
|
|
|
+end;
|
|
|
+
|
|
|
|
|
|
-function TRegistry.GetDataSize(const ValueName: string): Integer;
|
|
|
+function TRegistry.GetDataSize(const ValueName: UnicodeString): Integer;
|
|
|
|
|
|
Var
|
|
|
Info: TRegDataInfo;
|
|
@@ -305,7 +417,12 @@ begin
|
|
|
Result := -1;
|
|
|
end;
|
|
|
|
|
|
-function TRegistry.GetDataType(const ValueName: string): TRegDataType;
|
|
|
+function TRegistry.GetDataSize(const ValueName: String): Integer;
|
|
|
+begin
|
|
|
+ Result:=GetDataSize(UnicodeString(ValueName));
|
|
|
+end;
|
|
|
+
|
|
|
+function TRegistry.GetDataType(const ValueName: UnicodeString): TRegDataType;
|
|
|
|
|
|
Var
|
|
|
Info: TRegDataInfo;
|
|
@@ -315,6 +432,32 @@ begin
|
|
|
Result:=Info.RegData;
|
|
|
end;
|
|
|
|
|
|
+function TRegistry.GetDataType(const ValueName: String): TRegDataType;
|
|
|
+begin
|
|
|
+ Result:=GetDataType(UnicodeString(ValueName));
|
|
|
+end;
|
|
|
+
|
|
|
+
|
|
|
+function TRegistry.KeyExists(const Key: String): Boolean;
|
|
|
+begin
|
|
|
+ Result:=KeyExists(UnicodeString(Key));
|
|
|
+end;
|
|
|
+
|
|
|
+function TRegistry.LoadKey(const Key, FileName: String): Boolean;
|
|
|
+begin
|
|
|
+ Result:=LoadKey(UnicodeString(Key), UnicodeString(FileName));
|
|
|
+end;
|
|
|
+
|
|
|
+function TRegistry.OpenKey(const Key: String; CanCreate: Boolean): Boolean;
|
|
|
+begin
|
|
|
+ Result:=OpenKey(UnicodeString(Key), CanCreate);
|
|
|
+end;
|
|
|
+
|
|
|
+function TRegistry.OpenKeyReadOnly(const Key: String): Boolean;
|
|
|
+begin
|
|
|
+ Result:=OpenKeyReadOnly(UnicodeString(Key));
|
|
|
+end;
|
|
|
+
|
|
|
function TRegistry.HasSubKeys: Boolean;
|
|
|
|
|
|
Var
|
|
@@ -326,7 +469,7 @@ begin
|
|
|
Result:=(Info.NumSubKeys>0);
|
|
|
end;
|
|
|
|
|
|
-function TRegistry.ReadBinaryData(const Name: string; var Buffer; BufSize: Integer): Integer;
|
|
|
+function TRegistry.ReadBinaryData(const Name: UnicodeString; var Buffer; BufSize: Integer): Integer;
|
|
|
|
|
|
Var
|
|
|
RegDataType: TRegDataType;
|
|
@@ -337,7 +480,13 @@ begin
|
|
|
Raise ERegistryException.CreateFmt(SInvalidRegType, [Name]);
|
|
|
end;
|
|
|
|
|
|
-function TRegistry.ReadInteger(const Name: string): Integer;
|
|
|
+function TRegistry.ReadBinaryData(const Name: String; var Buffer;
|
|
|
+ BufSize: Integer): Integer;
|
|
|
+begin
|
|
|
+ Result:=ReadBinaryData(UnicodeString(Name), Buffer, BufSize);
|
|
|
+end;
|
|
|
+
|
|
|
+function TRegistry.ReadInteger(const Name: UnicodeString): Integer;
|
|
|
|
|
|
Var
|
|
|
RegDataType: TRegDataType;
|
|
@@ -348,7 +497,12 @@ begin
|
|
|
Raise ERegistryException.CreateFmt(SInvalidRegType, [Name]);
|
|
|
end;
|
|
|
|
|
|
-function TRegistry.ReadInt64(const Name: string): Int64;
|
|
|
+function TRegistry.ReadInteger(const Name: String): Integer;
|
|
|
+begin
|
|
|
+ Result:=ReadInteger(UnicodeString(Name));
|
|
|
+end;
|
|
|
+
|
|
|
+function TRegistry.ReadInt64(const Name: UnicodeString): Int64;
|
|
|
|
|
|
Var
|
|
|
RegDataType: TRegDataType;
|
|
@@ -359,20 +513,35 @@ begin
|
|
|
Raise ERegistryException.CreateFmt(SInvalidRegType, [Name]);
|
|
|
end;
|
|
|
|
|
|
-function TRegistry.ReadBool(const Name: string): Boolean;
|
|
|
+function TRegistry.ReadInt64(const Name: String): Int64;
|
|
|
+begin
|
|
|
+ Result:=ReadInt64(UnicodeString(Name));
|
|
|
+end;
|
|
|
+
|
|
|
+function TRegistry.ReadBool(const Name: UnicodeString): Boolean;
|
|
|
|
|
|
begin
|
|
|
Result:=ReadInteger(Name)<>0;
|
|
|
end;
|
|
|
|
|
|
-function TRegistry.ReadCurrency(const Name: string): Currency;
|
|
|
+function TRegistry.ReadBool(const Name: String): Boolean;
|
|
|
+begin
|
|
|
+ Result:=ReadBool(UnicodeString(Name));
|
|
|
+end;
|
|
|
+
|
|
|
+function TRegistry.ReadCurrency(const Name: UnicodeString): Currency;
|
|
|
|
|
|
begin
|
|
|
Result:=Default(Currency);
|
|
|
ReadBinaryData(Name, Result, SizeOf(Currency));
|
|
|
end;
|
|
|
|
|
|
-function TRegistry.ReadDate(const Name: string): TDateTime;
|
|
|
+function TRegistry.ReadCurrency(const Name: String): Currency;
|
|
|
+begin
|
|
|
+ Result:=ReadCurrency(UnicodeString(Name));
|
|
|
+end;
|
|
|
+
|
|
|
+function TRegistry.ReadDate(const Name: UnicodeString): TDateTime;
|
|
|
|
|
|
begin
|
|
|
Result:=Default(TDateTime);
|
|
@@ -380,21 +549,36 @@ begin
|
|
|
Result:=Trunc(Result);
|
|
|
end;
|
|
|
|
|
|
-function TRegistry.ReadDateTime(const Name: string): TDateTime;
|
|
|
+function TRegistry.ReadDate(const Name: String): TDateTime;
|
|
|
+begin
|
|
|
+ Result:=ReadDate(UnicodeString(Name));
|
|
|
+end;
|
|
|
+
|
|
|
+function TRegistry.ReadDateTime(const Name: UnicodeString): TDateTime;
|
|
|
|
|
|
begin
|
|
|
Result:=Default(TDateTime);
|
|
|
ReadBinaryData(Name, Result, SizeOf(TDateTime));
|
|
|
end;
|
|
|
|
|
|
-function TRegistry.ReadFloat(const Name: string): Double;
|
|
|
+function TRegistry.ReadDateTime(const Name: String): TDateTime;
|
|
|
+begin
|
|
|
+ Result:=ReadDateTime(UnicodeString(Name));
|
|
|
+end;
|
|
|
+
|
|
|
+function TRegistry.ReadFloat(const Name: UnicodeString): Double;
|
|
|
|
|
|
begin
|
|
|
Result:=Default(Double);
|
|
|
ReadBinaryData(Name,Result,SizeOf(Double));
|
|
|
end;
|
|
|
|
|
|
-function TRegistry.ReadString(const Name: string): string;
|
|
|
+function TRegistry.ReadFloat(const Name: String): Double;
|
|
|
+begin
|
|
|
+ Result:=ReadFloat(UnicodeString(Name));
|
|
|
+end;
|
|
|
+
|
|
|
+function TRegistry.ReadString(const Name: UnicodeString): UnicodeString;
|
|
|
|
|
|
Var
|
|
|
Info : TRegDataInfo;
|
|
@@ -421,46 +605,138 @@ begin
|
|
|
if StringSizeIncludesNull and
|
|
|
(u[Length(u)] = WideChar(0)) then
|
|
|
SetLength(u,Length(u)-1);
|
|
|
- Result:=UTF8Encode(u);
|
|
|
+ Result:=u;
|
|
|
end;
|
|
|
end;
|
|
|
end;
|
|
|
|
|
|
-procedure TRegistry.ReadStringList(const Name: string; AList: TStrings);
|
|
|
+function TRegistry.ReadString(const Name: String): string;
|
|
|
+begin
|
|
|
+ Result:=ReadString(UnicodeString(Name));
|
|
|
+end;
|
|
|
+
|
|
|
+
|
|
|
+procedure TRegistry.ReadStringList(const Name: UnicodeString; AList: TStrings; ForceUtf8: Boolean=False);
|
|
|
+
|
|
|
+Var
|
|
|
+ UArr: TUnicodeStringArray;
|
|
|
+
|
|
|
+begin
|
|
|
+ UArr := ReadStringArray(Name);
|
|
|
+ ArrayToList(UArr, AList, ForceUtf8);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TRegistry.ReadStringList(const Name: String; AList: TStrings);
|
|
|
+begin
|
|
|
+ ReadStringList(UnicodeString(Name), AList);
|
|
|
+end;
|
|
|
+
|
|
|
+function TRegistry.RegMultiSzDataToUnicodeStringArray(U: UnicodeString): TUnicodeStringArray;
|
|
|
+var
|
|
|
+ Len, i, p: Integer;
|
|
|
+ Sub: UnicodeString;
|
|
|
+begin
|
|
|
+ Result := nil;
|
|
|
+ if (U = '') then Exit;
|
|
|
+ Len := 1;
|
|
|
+ for i := 1 to Length(U) do if (U[i] = #0) then Inc(Len);
|
|
|
+ SetLength(Result, Len);
|
|
|
+ i := 0;
|
|
|
+
|
|
|
+ while (U <> '') and (i < Length(Result)) do
|
|
|
+ begin
|
|
|
+ p := Pos(#0, U);
|
|
|
+ if (p = 0) then p := Length(U) + 1;
|
|
|
+ Sub := Copy(U, 1, p - 1);
|
|
|
+ Result[i] := Sub;
|
|
|
+ System.Delete(U, 1, p);
|
|
|
+ Inc(i);
|
|
|
+ end;
|
|
|
+end;
|
|
|
+
|
|
|
+function TRegistry.ListToArray(List: TStrings; IsUtf8: Boolean): TUnicodeStringArray;
|
|
|
+var
|
|
|
+ i, curr, Len: Integer;
|
|
|
+ u: UnicodeString;
|
|
|
+begin
|
|
|
+ Result := nil;
|
|
|
+ Len := List.Count;
|
|
|
+ SetLength(Result, Len);
|
|
|
+ //REG_MULTI_SZ data cannot contain empty strings
|
|
|
+ curr := 0;
|
|
|
+ for i := 0 to List.Count - 1 do
|
|
|
+ begin
|
|
|
+ if IsUtf8 then
|
|
|
+ u := Utf8Decode(List[i])
|
|
|
+ else
|
|
|
+ u := List[i];
|
|
|
+ if (u>'') then
|
|
|
+ begin
|
|
|
+ Result[curr] := u;
|
|
|
+ inc(curr);
|
|
|
+ end
|
|
|
+ else
|
|
|
+ Dec(Len);
|
|
|
+ end;
|
|
|
+ if (Len <> List.Count) then SetLength(Result, Len);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TRegistry.ArrayToList(const Arr: TUnicodeStringArray; List: TStrings; ForceUtf8: Boolean);
|
|
|
+var
|
|
|
+ i: Integer;
|
|
|
+begin
|
|
|
+ List.Clear;
|
|
|
+ for i := Low(Arr) to High(Arr) do
|
|
|
+ begin
|
|
|
+ if ForceUtf8 then
|
|
|
+ List.Add(Utf8Encode(Arr[i]))
|
|
|
+ else
|
|
|
+ List.Add(String(Arr[i]));
|
|
|
+ end;
|
|
|
+end;
|
|
|
|
|
|
+function TRegistry.ReadStringArray(const Name: UnicodeString): TUnicodeStringArray;
|
|
|
Var
|
|
|
Info : TRegDataInfo;
|
|
|
ReadDataSize: Integer;
|
|
|
- Data: string;
|
|
|
+ Data: UnicodeString;
|
|
|
|
|
|
begin
|
|
|
- AList.Clear;
|
|
|
+ Result := nil;
|
|
|
GetDataInfo(Name,Info);
|
|
|
+ //writeln('TRegistry.ReadStringArray: datasize=',info.datasize);
|
|
|
if info.datasize>0 then
|
|
|
begin
|
|
|
If Not (Info.RegData in [rdMultiString]) then
|
|
|
Raise ERegistryException.CreateFmt(SInvalidRegType, [Name]);
|
|
|
SetLength(Data,Info.DataSize);
|
|
|
- ReadDataSize := GetData(Name,PChar(Data),Info.DataSize,Info.RegData);
|
|
|
+ ReadDataSize := GetData(Name,PWideChar(Data),Info.DataSize,Info.RegData) div SizeOf(WideChar);
|
|
|
+ //writeln('TRegistry.ReadStringArray: ReadDataSize=',ReadDataSize);
|
|
|
if ReadDataSize > 0 then
|
|
|
begin
|
|
|
- // If the data has the REG_SZ, REG_MULTI_SZ or REG_EXPAND_SZ type,
|
|
|
- // the size includes any terminating null character or characters
|
|
|
- // unless the data was stored without them! (RegQueryValueEx @ MSDN)
|
|
|
- if StringSizeIncludesNull then begin
|
|
|
- if Data[ReadDataSize] = #0 then
|
|
|
- Dec(ReadDataSize);
|
|
|
- if Data[ReadDataSize] = #0 then
|
|
|
- Dec(ReadDataSize);
|
|
|
- end;
|
|
|
+ // Windows returns the data with or without trailing zero's, so just strip all trailing null characters
|
|
|
+ while (Data[ReadDataSize] = #0) do Dec(ReadDataSize);
|
|
|
SetLength(Data, ReadDataSize);
|
|
|
- Data := StringReplace(Data, #0, LineEnding, [rfReplaceAll]);
|
|
|
- AList.Text := Data;
|
|
|
+ //writeln('Data=',dbgs(data));
|
|
|
+ //Data := UnicodeStringReplace(Data, #0, AList.LineBreak, [rfReplaceAll]);
|
|
|
+ //AList.Text := Data;
|
|
|
+ Result := RegMultiSzDataToUnicodeStringArray(Data);
|
|
|
end
|
|
|
end
|
|
|
end;
|
|
|
|
|
|
-function TRegistry.ReadTime(const Name: string): TDateTime;
|
|
|
+function TRegistry.ReadStringArray(const Name: String): TStringArray;
|
|
|
+var
|
|
|
+ UArr: TUnicodeStringArray;
|
|
|
+ i: Integer;
|
|
|
+begin
|
|
|
+ Result := nil;
|
|
|
+ UArr := ReadStringArray(UnicodeString(Name));
|
|
|
+ SetLength(Result, Length(UArr));
|
|
|
+ for i := Low(UArr) to High(UArr) do Result[i] := UArr[i];
|
|
|
+end;
|
|
|
+
|
|
|
+function TRegistry.ReadTime(const Name: UnicodeString): TDateTime;
|
|
|
|
|
|
begin
|
|
|
Result:=Default(TDateTime);
|
|
@@ -468,83 +744,228 @@ begin
|
|
|
Result:=Frac(Result);
|
|
|
end;
|
|
|
|
|
|
-procedure TRegistry.WriteBinaryData(const Name: string; var Buffer; BufSize: Integer);
|
|
|
+function TRegistry.ReadTime(const Name: String): TDateTime;
|
|
|
+begin
|
|
|
+ Result:=ReadTime(UnicodeString(Name));
|
|
|
+end;
|
|
|
+
|
|
|
+function TRegistry.RegistryConnect(const UNCName: String): Boolean;
|
|
|
+begin
|
|
|
+ Result:=RegistryConnect(UnicodeString(UNCName));
|
|
|
+end;
|
|
|
+
|
|
|
+function TRegistry.ReplaceKey(const Key, FileName, BackUpFileName: String): Boolean;
|
|
|
+begin
|
|
|
+ Result:=ReplaceKey(UnicodeString(Key), UnicodeString(FileName), UnicodeString(BackUpFileName))
|
|
|
+end;
|
|
|
+
|
|
|
+function TRegistry.RestoreKey(const Key, FileName: String): Boolean;
|
|
|
+begin
|
|
|
+ Result:=RestoreKey(UnicodeString(Key), UnicodeString(FileName));
|
|
|
+end;
|
|
|
+
|
|
|
+function TRegistry.SaveKey(const Key, FileName: String): Boolean;
|
|
|
+begin
|
|
|
+ Result:=SaveKey(UnicodeString(Key), UnicodeString(FileName));
|
|
|
+end;
|
|
|
+
|
|
|
+function TRegistry.UnLoadKey(const Key: String): Boolean;
|
|
|
+begin
|
|
|
+ Result:=UnloadKey(UnicodeString(Key));
|
|
|
+end;
|
|
|
+
|
|
|
+function TRegistry.ValueExists(const Name: String): Boolean;
|
|
|
+begin
|
|
|
+ Result:=ValueExists(UnicodeString(Name));
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TRegistry.WriteBinaryData(const Name: UnicodeString; var Buffer; BufSize: Integer);
|
|
|
begin
|
|
|
PutData(Name, @Buffer, BufSize, rdBinary);
|
|
|
end;
|
|
|
|
|
|
-procedure TRegistry.WriteBool(const Name: string; Value: Boolean);
|
|
|
+procedure TRegistry.WriteBinaryData(const Name: String; var Buffer;
|
|
|
+ BufSize: Integer);
|
|
|
+begin
|
|
|
+ WriteBinaryData(UnicodeString(Name), Buffer, BufSize);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TRegistry.WriteBool(const Name: UnicodeString; Value: Boolean);
|
|
|
|
|
|
begin
|
|
|
WriteInteger(Name,Ord(Value));
|
|
|
end;
|
|
|
|
|
|
-procedure TRegistry.WriteCurrency(const Name: string; Value: Currency);
|
|
|
+procedure TRegistry.WriteBool(const Name: String; Value: Boolean);
|
|
|
+begin
|
|
|
+ WriteBool(UnicodeString(Name), Value);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TRegistry.WriteCurrency(const Name: UnicodeString; Value: Currency);
|
|
|
begin
|
|
|
WriteBinaryData(Name, Value, SizeOf(Currency));
|
|
|
end;
|
|
|
|
|
|
-procedure TRegistry.WriteDate(const Name: string; Value: TDateTime);
|
|
|
+procedure TRegistry.WriteCurrency(const Name: String; Value: Currency);
|
|
|
+begin
|
|
|
+ WriteCurrency(UnicodeString(Name), Value);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TRegistry.WriteDate(const Name: UnicodeString; Value: TDateTime);
|
|
|
begin
|
|
|
WriteBinarydata(Name, Value, SizeOf(TDateTime));
|
|
|
end;
|
|
|
|
|
|
-procedure TRegistry.WriteTime(const Name: string; Value: TDateTime);
|
|
|
+procedure TRegistry.WriteDate(const Name: String; Value: TDateTime);
|
|
|
+begin
|
|
|
+ WriteDate(UnicodeString(Name), Value);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TRegistry.WriteTime(const Name: UnicodeString; Value: TDateTime);
|
|
|
begin
|
|
|
WriteBinaryData(Name, Value, SizeOf(TDateTime));
|
|
|
end;
|
|
|
|
|
|
-procedure TRegistry.WriteDateTime(const Name: string; Value: TDateTime);
|
|
|
+procedure TRegistry.WriteTime(const Name: String; Value: TDateTime);
|
|
|
+begin
|
|
|
+ WriteTime(UnicodeString(Name), Value);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TRegistry.WriteDateTime(const Name: UnicodeString; Value: TDateTime);
|
|
|
begin
|
|
|
WriteBinaryData(Name, Value, SizeOf(TDateTime));
|
|
|
end;
|
|
|
|
|
|
-procedure TRegistry.WriteExpandString(const Name, Value: string);
|
|
|
-var
|
|
|
- u: UnicodeString;
|
|
|
+procedure TRegistry.WriteDateTime(const Name: String; Value: TDateTime);
|
|
|
+begin
|
|
|
+ WriteDateTime(UnicodeString(Name), Value);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TRegistry.WriteExpandString(const Name, Value: UnicodeString);
|
|
|
+begin
|
|
|
+ PutData(Name, PWideChar(Value), ByteLength(Value), rdExpandString);
|
|
|
+end;
|
|
|
|
|
|
+procedure TRegistry.WriteExpandString(const Name, Value: String);
|
|
|
begin
|
|
|
- u:=Value;
|
|
|
- PutData(Name, PWideChar(u), ByteLength(u), rdExpandString);
|
|
|
+ WriteExpandString(UnicodeString(Name), UnicodeString(Value));
|
|
|
end;
|
|
|
|
|
|
-procedure TRegistry.WriteStringList(const Name: string; List: TStrings);
|
|
|
+
|
|
|
+procedure TRegistry.WriteStringList(const Name: UnicodeString; List: TStrings; IsUtf8: Boolean=False);
|
|
|
|
|
|
Var
|
|
|
- Data: string;
|
|
|
+ UArr: TUnicodeStringArray;
|
|
|
+begin
|
|
|
+ UArr := ListToArray(List, IsUtf8);
|
|
|
+ WriteStringArray(Name, UArr);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TRegistry.WriteStringArray(const Name: UnicodeString; const Arr: TUnicodeStringArray);
|
|
|
+Var
|
|
|
+ Data: UnicodeString;
|
|
|
+ u: UnicodeString;
|
|
|
+ i: Integer;
|
|
|
+begin
|
|
|
+ Data := '';
|
|
|
+ //REG_MULTI_SZ data cannot contain empty strings
|
|
|
+ for i := Low(Arr) to High(Arr) do
|
|
|
+ begin
|
|
|
+ u := Arr[i];
|
|
|
+ if (u>'') then
|
|
|
+ begin
|
|
|
+ if (Data>'') then
|
|
|
+ Data := Data + #0 + u
|
|
|
+ else
|
|
|
+ Data := Data + u;
|
|
|
+ end;
|
|
|
+ end;
|
|
|
+ if StringSizeIncludesNull then
|
|
|
+ Data := Data + #0#0;
|
|
|
+ //writeln('Data=',Dbgs(Data));
|
|
|
+ PutData(Name, PWideChar(Data), ByteLength(Data), rdMultiString);
|
|
|
+end;
|
|
|
|
|
|
+procedure TRegistry.WriteStringArray(const Name: String; const Arr: TStringArray);
|
|
|
+var
|
|
|
+ UArr: TUnicodeStringArray;
|
|
|
+ i: Integer;
|
|
|
begin
|
|
|
- Data := StringReplace(List.Text, LineEnding, #0, [rfReplaceAll]) + #0#0;
|
|
|
- PutData(Name, PChar(Data), Length(Data),rdMultiString);
|
|
|
+ UArr := nil;
|
|
|
+ SetLength(UArr, Length(Arr));
|
|
|
+ for i := Low(Arr) to High(Arr) do UArr[i] := Arr[i];
|
|
|
+ WriteStringArray(UnicodeString(Name), UArr);
|
|
|
end;
|
|
|
|
|
|
-procedure TRegistry.WriteFloat(const Name: string; Value: Double);
|
|
|
+procedure TRegistry.WriteFloat(const Name: UnicodeString; Value: Double);
|
|
|
begin
|
|
|
WriteBinaryData(Name, Value, SizeOf(Double));
|
|
|
end;
|
|
|
|
|
|
-procedure TRegistry.WriteInteger(const Name: string; Value: Integer);
|
|
|
+procedure TRegistry.WriteFloat(const Name: String; Value: Double);
|
|
|
+begin
|
|
|
+ WriteFloat(UnicodeString(Name), Value);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TRegistry.WriteInteger(const Name: UnicodeString; Value: Integer);
|
|
|
begin
|
|
|
PutData(Name, @Value, SizeOf(Integer), rdInteger);
|
|
|
end;
|
|
|
|
|
|
-procedure TRegistry.WriteInt64(const Name: string; Value: Int64);
|
|
|
+procedure TRegistry.WriteInteger(const Name: String; Value: Integer);
|
|
|
+begin
|
|
|
+ WriteInteger(UnicodeString(Name), Value);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TRegistry.WriteInt64(const Name: UnicodeString; Value: Int64);
|
|
|
begin
|
|
|
PutData(Name, @Value, SizeOf(Int64), rdInt64);
|
|
|
end;
|
|
|
|
|
|
-procedure TRegistry.WriteString(const Name, Value: string);
|
|
|
+procedure TRegistry.WriteInt64(const Name: String; Value: Int64);
|
|
|
+begin
|
|
|
+ WriteInt64(UnicodeString(Name), Value);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TRegistry.WriteString(const Name, Value: UnicodeString);
|
|
|
+begin
|
|
|
+ PutData(Name, PWideChar(Value), ByteLength(Value), rdString);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TRegistry.WriteString(const Name, Value: String);
|
|
|
+begin
|
|
|
+ WriteString(UnicodeString(Name), UnicodeString(Value));
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TRegistry.GetKeyNames(Strings: TStrings);
|
|
|
var
|
|
|
- u: UnicodeString;
|
|
|
+ UArr: TUnicodeStringArray;
|
|
|
+begin
|
|
|
+ UArr := GetKeyNames;
|
|
|
+ ArrayToList(UArr, Strings, True);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TRegistry.GetValueNames(Strings: TStrings);
|
|
|
+var
|
|
|
+ UArr: TUnicodeStringArray;
|
|
|
+begin
|
|
|
+ UArr := GetValueNames;
|
|
|
+ ArrayToList(UArr, Strings, True);
|
|
|
+end;
|
|
|
|
|
|
+procedure TRegistry.MoveKey(const OldName, NewName: UnicodeString; Delete: Boolean);
|
|
|
begin
|
|
|
- u:=Value;
|
|
|
- PutData(Name, PWideChar(u), ByteLength(u), rdString);
|
|
|
+
|
|
|
end;
|
|
|
|
|
|
-procedure TRegistry.MoveKey(const OldName, NewName: string; Delete: Boolean);
|
|
|
+procedure TRegistry.MoveKey(const OldName, NewName: String; Delete: Boolean);
|
|
|
begin
|
|
|
+ MoveKey(UnicodeString(OldName), UnicodeString(NewName), Delete);
|
|
|
+end;
|
|
|
|
|
|
+procedure TRegistry.RenameValue(const OldName, NewName: String);
|
|
|
+begin
|
|
|
+ RenameValue(UnicodeString(OldName), UnicodeString(NewName));
|
|
|
end;
|
|
|
|
|
|
{ ---------------------------------------------------------------------
|
|
@@ -583,7 +1004,7 @@ function TRegistryIniFile.ReadBinaryStream(const Section, Name: string;
|
|
|
Value: TStream): Integer;
|
|
|
begin
|
|
|
result:=-1; // unimplemented
|
|
|
- //
|
|
|
+ //
|
|
|
end;
|
|
|
|
|
|
function TRegistryIniFile.ReadDate(const Section, Name: string;
|