1 |
|
---|
2 | {*****************************************************************************}
|
---|
3 | { }
|
---|
4 | { Tnt Delphi Unicode Controls }
|
---|
5 | { http://www.tntware.com/delphicontrols/unicode/ }
|
---|
6 | { Version: 2.3.0 }
|
---|
7 | { }
|
---|
8 | { Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) }
|
---|
9 | { }
|
---|
10 | {*****************************************************************************}
|
---|
11 |
|
---|
12 | unit TntRegistry;
|
---|
13 |
|
---|
14 | {$INCLUDE TntCompilers.inc}
|
---|
15 |
|
---|
16 | interface
|
---|
17 |
|
---|
18 | uses
|
---|
19 | Registry, Windows, TntClasses;
|
---|
20 |
|
---|
21 | {TNT-WARN TRegistry}
|
---|
22 | type
|
---|
23 | TTntRegistry = class(TRegistry{TNT-ALLOW TRegistry})
|
---|
24 | private
|
---|
25 | procedure WriteStringEx(dwType: DWORD; const Name, Value: WideString);
|
---|
26 | public
|
---|
27 | procedure GetKeyNames(Strings: TTntStrings);
|
---|
28 | procedure GetValueNames(Strings: TTntStrings);
|
---|
29 | function ReadString(const Name: WideString): WideString;
|
---|
30 | procedure WriteString(const Name, Value: WideString);
|
---|
31 | procedure WriteExpandString(const Name, Value: WideString);
|
---|
32 | end;
|
---|
33 |
|
---|
34 | implementation
|
---|
35 |
|
---|
36 | uses
|
---|
37 | RTLConsts, SysUtils, TntSysUtils;
|
---|
38 |
|
---|
39 | { TTntRegistry }
|
---|
40 |
|
---|
41 | procedure TTntRegistry.GetKeyNames(Strings: TTntStrings);
|
---|
42 | var
|
---|
43 | Len: DWORD;
|
---|
44 | I: Integer;
|
---|
45 | Info: TRegKeyInfo;
|
---|
46 | S: WideString;
|
---|
47 | begin
|
---|
48 | if (not Win32PlatformIsUnicode) then
|
---|
49 | inherited GetKeyNames(Strings.AnsiStrings)
|
---|
50 | else begin
|
---|
51 | Strings.Clear;
|
---|
52 | if GetKeyInfo(Info) then
|
---|
53 | begin
|
---|
54 | SetLength(S, (Info.MaxSubKeyLen + 1) * 2);
|
---|
55 | for I := 0 to Info.NumSubKeys - 1 do
|
---|
56 | begin
|
---|
57 | Len := (Info.MaxSubKeyLen + 1) * 2;
|
---|
58 | if RegEnumKeyExW(CurrentKey, I, PWideChar(S), Len, nil, nil, nil, nil) = ERROR_SUCCESS then
|
---|
59 | Strings.Add(PWideChar(S));
|
---|
60 | end;
|
---|
61 | end;
|
---|
62 | end;
|
---|
63 | end;
|
---|
64 |
|
---|
65 | {$IFNDEF COMPILER_9_UP} // fix declaration for RegEnumValueW (lpValueName is a PWideChar)
|
---|
66 | function RegEnumValueW(hKey: HKEY; dwIndex: DWORD; lpValueName: PWideChar;
|
---|
67 | var lpcbValueName: DWORD; lpReserved: Pointer; lpType: PDWORD;
|
---|
68 | lpData: PByte; lpcbData: PDWORD): Longint; stdcall; external advapi32 name 'RegEnumValueW';
|
---|
69 | {$ENDIF}
|
---|
70 |
|
---|
71 | procedure TTntRegistry.GetValueNames(Strings: TTntStrings);
|
---|
72 | var
|
---|
73 | Len: DWORD;
|
---|
74 | I: Integer;
|
---|
75 | Info: TRegKeyInfo;
|
---|
76 | S: WideString;
|
---|
77 | begin
|
---|
78 | if (not Win32PlatformIsUnicode) then
|
---|
79 | inherited GetValueNames(Strings.AnsiStrings)
|
---|
80 | else begin
|
---|
81 | Strings.Clear;
|
---|
82 | if GetKeyInfo(Info) then
|
---|
83 | begin
|
---|
84 | SetLength(S, Info.MaxValueLen + 1);
|
---|
85 | for I := 0 to Info.NumValues - 1 do
|
---|
86 | begin
|
---|
87 | Len := Info.MaxValueLen + 1;
|
---|
88 | RegEnumValueW(CurrentKey, I, PWideChar(S), Len, nil, nil, nil, nil);
|
---|
89 | Strings.Add(PWideChar(S));
|
---|
90 | end;
|
---|
91 | end;
|
---|
92 | end;
|
---|
93 | end;
|
---|
94 |
|
---|
95 | function TTntRegistry.ReadString(const Name: WideString): WideString;
|
---|
96 | var
|
---|
97 | DataType: Cardinal;
|
---|
98 | BufSize: Cardinal;
|
---|
99 | begin
|
---|
100 | if (not Win32PlatformIsUnicode) then
|
---|
101 | result := inherited ReadString(Name)
|
---|
102 | else begin
|
---|
103 | // get length and type
|
---|
104 | DataType := REG_NONE;
|
---|
105 | if RegQueryValueExW(CurrentKey, PWideChar(Name), nil,
|
---|
106 | @DataType, nil, @BufSize) <> ERROR_SUCCESS then
|
---|
107 | Result := ''
|
---|
108 | else begin
|
---|
109 | // check type
|
---|
110 | if not (DataType in [REG_SZ, REG_EXPAND_SZ]) then
|
---|
111 | raise ERegistryException.CreateFmt(SInvalidRegType, [Name]);
|
---|
112 | if BufSize = 1 then
|
---|
113 | BufSize := SizeOf(WideChar); // sometimes this occurs for single character values!
|
---|
114 | SetLength(Result, BufSize div SizeOf(WideChar));
|
---|
115 | if RegQueryValueExW(CurrentKey, PWideChar(Name), nil,
|
---|
116 | @DataType, PByte(PWideChar(Result)), @BufSize) <> ERROR_SUCCESS then
|
---|
117 | raise ERegistryException.CreateFmt(SRegGetDataFailed, [Name]);
|
---|
118 | Result := PWideChar(Result);
|
---|
119 | end
|
---|
120 | end
|
---|
121 | end;
|
---|
122 |
|
---|
123 | procedure TTntRegistry.WriteStringEx(dwType: DWORD; const Name, Value: WideString);
|
---|
124 | begin
|
---|
125 | Assert(dwType in [REG_SZ, REG_EXPAND_SZ]);
|
---|
126 | if (not Win32PlatformIsUnicode) then begin
|
---|
127 | if dwType = REG_SZ then
|
---|
128 | inherited WriteString(Name, Value)
|
---|
129 | else
|
---|
130 | inherited WriteExpandString(Name, Value);
|
---|
131 | end else begin
|
---|
132 | if RegSetValueExW(CurrentKey, PWideChar(Name), 0, dwType,
|
---|
133 | PWideChar(Value), (Length(Value) + 1) * SizeOf(WideChar)) <> ERROR_SUCCESS then
|
---|
134 | raise ERegistryException.CreateFmt(SRegSetDataFailed, [Name]);
|
---|
135 | end;
|
---|
136 | end;
|
---|
137 |
|
---|
138 | procedure TTntRegistry.WriteString(const Name, Value: WideString);
|
---|
139 | begin
|
---|
140 | WriteStringEx(REG_SZ, Name, Value);
|
---|
141 | end;
|
---|
142 |
|
---|
143 | procedure TTntRegistry.WriteExpandString(const Name, Value: WideString);
|
---|
144 | begin
|
---|
145 | WriteStringEx(REG_EXPAND_SZ, Name, Value);
|
---|
146 | end;
|
---|
147 |
|
---|
148 | end.
|
---|