registry.pp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. Unit registry;
  2. {$mode objfpc}
  3. {$H+}
  4. interface
  5. {$ifndef win32}
  6. {$define XMLREG}
  7. {$endif}
  8. Uses
  9. {$ifndef XMLREG}
  10. Windows,
  11. {$endif XMLREG}
  12. Classes,
  13. SysUtils;
  14. {$I regdef.inc}
  15. type
  16. ERegistryException = class(Exception);
  17. TRegKeyInfo = record
  18. NumSubKeys: Integer;
  19. MaxSubKeyLen: Integer;
  20. NumValues: Integer;
  21. MaxValueLen: Integer;
  22. MaxDataLen: Integer;
  23. FileTime: TDateTime;
  24. end;
  25. TRegDataType = (rdUnknown, rdString, rdExpandString, rdInteger, rdBinary);
  26. TRegDataInfo = record
  27. RegData: TRegDataType;
  28. DataSize: Integer;
  29. end;
  30. { ---------------------------------------------------------------------
  31. TRegistry
  32. ---------------------------------------------------------------------}
  33. TRegistry = class(TObject)
  34. private
  35. FStringSizeIncludesNull : Boolean;
  36. FSysData : Pointer;
  37. fAccess: LongWord;
  38. fCurrentKey: HKEY;
  39. fRootKey: HKEY;
  40. fLazyWrite: Boolean;
  41. fCurrentPath: string;
  42. procedure SetRootKey(Value: HKEY);
  43. Procedure SysRegCreate;
  44. Procedure SysRegFree;
  45. Function SysGetData(const Name: String; Buffer: Pointer; BufSize: Integer; var RegData: TRegDataType): Integer;
  46. Function SysPutData(const Name: string; Buffer: Pointer; BufSize: Integer; RegData: TRegDataType) : Boolean;
  47. Function SysCreateKey(const Key: String): Boolean;
  48. protected
  49. function GetBaseKey(Relative: Boolean): HKey;
  50. function GetData(const Name: string; Buffer: Pointer;
  51. BufSize: Integer; var RegData: TRegDataType): Integer;
  52. function GetKey(const Key: string): HKEY;
  53. procedure ChangeKey(Value: HKey; const Path: string);
  54. procedure PutData(const Name: string; Buffer: Pointer;
  55. BufSize: Integer; RegData: TRegDataType);
  56. procedure SetCurrentKey(Value: HKEY);
  57. public
  58. constructor Create;
  59. destructor Destroy; override;
  60. function CreateKey(const Key: string): Boolean;
  61. function DeleteKey(const Key: string): Boolean;
  62. function DeleteValue(const Name: string): Boolean;
  63. function GetDataInfo(const ValueName: string; var Value: TRegDataInfo): Boolean;
  64. function GetDataSize(const ValueName: string): Integer;
  65. function GetDataType(const ValueName: string): TRegDataType;
  66. function GetKeyInfo(var Value: TRegKeyInfo): Boolean;
  67. function HasSubKeys: Boolean;
  68. function KeyExists(const Key: string): Boolean;
  69. function LoadKey(const Key, FileName: string): Boolean;
  70. function OpenKey(const Key: string; CanCreate: Boolean): Boolean;
  71. function OpenKeyReadOnly(const Key: string): Boolean;
  72. function ReadCurrency(const Name: string): Currency;
  73. function ReadBinaryData(const Name: string; var Buffer; BufSize: Integer): Integer;
  74. function ReadBool(const Name: string): Boolean;
  75. function ReadDate(const Name: string): TDateTime;
  76. function ReadDateTime(const Name: string): TDateTime;
  77. function ReadFloat(const Name: string): Double;
  78. function ReadInteger(const Name: string): Integer;
  79. function ReadString(const Name: string): string;
  80. function ReadTime(const Name: string): TDateTime;
  81. function RegistryConnect(const UNCName: string): Boolean;
  82. function ReplaceKey(const Key, FileName, BackUpFileName: string): Boolean;
  83. function RestoreKey(const Key, FileName: string): Boolean;
  84. function SaveKey(const Key, FileName: string): Boolean;
  85. function UnLoadKey(const Key: string): Boolean;
  86. function ValueExists(const Name: string): Boolean;
  87. procedure CloseKey;
  88. procedure GetKeyNames(Strings: TStrings);
  89. procedure GetValueNames(Strings: TStrings);
  90. procedure MoveKey(const OldName, NewName: string; Delete: Boolean);
  91. procedure RenameValue(const OldName, NewName: string);
  92. procedure WriteCurrency(const Name: string; Value: Currency);
  93. procedure WriteBinaryData(const Name: string; var Buffer; BufSize: Integer);
  94. procedure WriteBool(const Name: string; Value: Boolean);
  95. procedure WriteDate(const Name: string; Value: TDateTime);
  96. procedure WriteDateTime(const Name: string; Value: TDateTime);
  97. procedure WriteFloat(const Name: string; Value: Double);
  98. procedure WriteInteger(const Name: string; Value: Integer);
  99. procedure WriteString(const Name, Value: string);
  100. procedure WriteExpandString(const Name, Value: string);
  101. procedure WriteTime(const Name: string; Value: TDateTime);
  102. property Access: LongWord read fAccess write fAccess;
  103. property CurrentKey: HKEY read fCurrentKey;
  104. property CurrentPath: string read fCurrentPath;
  105. property LazyWrite: Boolean read fLazyWrite write fLazyWrite;
  106. property RootKey: HKEY read fRootKey write SetRootKey;
  107. Property StringSizeIncludesNull : Boolean read FStringSizeIncludesNull;
  108. end;
  109. { ---------------------------------------------------------------------
  110. TRegIniFile
  111. ---------------------------------------------------------------------}
  112. TRegIniFile = class(TRegistry)
  113. private
  114. fFileName: String;
  115. public
  116. constructor Create(const FN: string);
  117. function ReadString(const Section, Ident, Default: string): string;
  118. function ReadInteger(const Section, Ident: string;
  119. Default: Longint): Longint;
  120. function ReadBool(const Section, Ident: string; Default: Boolean): Boolean;
  121. procedure WriteString(const Section, Ident, Value: String);
  122. procedure WriteInteger(const Section, Ident: string; Value: Longint);
  123. procedure WriteBool(const Section, Ident: string; Value: Boolean);
  124. procedure ReadSection(const Section: string; Strings: TStrings);
  125. procedure ReadSections(Strings: TStrings);
  126. procedure ReadSectionValues(const Section: string; Strings: TStrings);
  127. procedure EraseSection(const Section: string);
  128. procedure DeleteKey(const Section, Ident: String);
  129. property FileName: String read fFileName;
  130. end;
  131. ResourceString
  132. SInvalidRegType = 'Invalid registry data type: "%s"';
  133. SRegCreateFailed = 'Failed to create key: "%s"';
  134. SRegSetDataFailed = 'Failed to set data for value "%s"';
  135. SRegGetDataFailed = 'Failed to get data for value "%s"';
  136. implementation
  137. { ---------------------------------------------------------------------
  138. Include implementation-dependent code
  139. ---------------------------------------------------------------------}
  140. {$ifdef XMLREG}
  141. {$i xregreg.inc}
  142. {$else}
  143. {$i winreg.inc}
  144. {$endif}
  145. { ---------------------------------------------------------------------
  146. Generic, implementation-independent code.
  147. ---------------------------------------------------------------------}
  148. Constructor TRegistry.Create;
  149. begin
  150. inherited Create;
  151. FAccess := KEY_ALL_ACCESS;
  152. FRootKey := HKEY_CURRENT_USER;
  153. FLazyWrite := True;
  154. FCurrentKey := 0;
  155. SysRegCreate;
  156. end;
  157. Destructor TRegistry.Destroy;
  158. begin
  159. CloseKey;
  160. SysRegFree;
  161. inherited Destroy;
  162. end;
  163. function TRegistry.CreateKey(const Key: String): Boolean;
  164. begin
  165. Result:=SysCreateKey(Key);
  166. If Not Result Then
  167. Raise ERegistryException.CreateFmt(SRegCreateFailed, [Key]);
  168. end;
  169. function TRegistry.GetBaseKey(Relative: Boolean): HKey;
  170. begin
  171. If Relative Then
  172. Result := CurrentKey
  173. else
  174. Result := RootKey;
  175. end;
  176. function TRegistry.GetData(const Name: String; Buffer: Pointer;
  177. BufSize: Integer; var RegData: TRegDataType): Integer;
  178. begin
  179. Result:=SysGetData(Name,Buffer,BufSize,RegData);
  180. If (Result=-1) then
  181. Raise ERegistryException.CreateFmt(SRegGetDataFailed, [Name]);
  182. end;
  183. procedure TRegistry.PutData(const Name: string; Buffer: Pointer;
  184. BufSize: Integer; RegData: TRegDataType);
  185. begin
  186. If Not SysPutData(Name,Buffer,BufSize,RegData) then
  187. Raise ERegistryException.CreateFmt(SRegSetDataFailed, [Name]);
  188. end;
  189. function TRegistry.GetDataSize(const ValueName: String): Integer;
  190. Var
  191. Info: TRegDataInfo;
  192. begin
  193. If GetDataInfo(ValueName,Info) Then
  194. Result := Info.DataSize
  195. else
  196. Result := -1;
  197. end;
  198. function TRegistry.GetDataType(const ValueName: string): TRegDataType;
  199. Var
  200. Info: TRegDataInfo;
  201. begin
  202. GetDataInfo(ValueName, Info);
  203. Result:=Info.RegData;
  204. end;
  205. Function TRegistry.HasSubKeys: Boolean;
  206. Var
  207. Info : TRegKeyInfo;
  208. begin
  209. Result:=GetKeyInfo(Info);
  210. If Result then
  211. Result:=(Info.NumSubKeys>0);
  212. end;
  213. function TRegistry.ReadBinaryData(const Name: string; var Buffer; BufSize: Integer): Integer;
  214. Var
  215. RegDataType: TRegDataType;
  216. begin
  217. Result := GetData(Name, @Buffer, BufSize, RegDataType);
  218. If (RegDataType<>rdBinary) Then
  219. Raise ERegistryException.CreateFmt(SInvalidRegType, [Name]);
  220. end;
  221. function TRegistry.ReadInteger(const Name: string): Integer;
  222. Var
  223. RegDataType: TRegDataType;
  224. begin
  225. GetData(Name, @Result, SizeOf(Integer), RegDataType);
  226. If RegDataType<>rdInteger Then
  227. Raise ERegistryException.CreateFmt(SInvalidRegType, [Name]);
  228. end;
  229. function TRegistry.ReadBool(const Name: string): Boolean;
  230. begin
  231. Result:=ReadInteger(Name)<>0;
  232. end;
  233. function TRegistry.ReadCurrency(const Name: string): Currency;
  234. Var
  235. RegDataType: TRegDataType;
  236. begin
  237. ReadBinaryData(Name, Result, SizeOf(Currency));
  238. end;
  239. function TRegistry.ReadDate(const Name: string): TDateTime;
  240. begin
  241. ReadBinaryData(Name, Result, SizeOf(TDateTime));
  242. Result:=Round(Result);
  243. end;
  244. function TRegistry.ReadDateTime(const Name: string): TDateTime;
  245. Var
  246. RegDataType: TRegDataType;
  247. begin
  248. ReadBinaryData(Name, Result, SizeOf(TDateTime));
  249. end;
  250. function TRegistry.ReadFloat(const Name: string): Double;
  251. begin
  252. ReadBinaryData(Name,Result,SizeOf(Double));
  253. end;
  254. function TRegistry.ReadString(const Name: string): string;
  255. Var
  256. Info : TRegDataInfo;
  257. begin
  258. GetDataInfo(Name,Info);
  259. If Not (Info.RegData in [rdString,rdExpandString]) then
  260. Raise ERegistryException.CreateFmt(SInvalidRegType, [Name]);
  261. SetLength(Result,Info.DataSize);
  262. If Info.DataSize>0 then
  263. begin
  264. If StringSizeIncludesNull then
  265. SetLength(Result, Info.DataSize-1)
  266. else
  267. SetLength(Result, Info.DataSize);
  268. GetData(Name,@Result[1],Info.DataSize,Info.RegData);
  269. end;
  270. end;
  271. function TRegistry.ReadTime(const Name: string): TDateTime;
  272. begin
  273. ReadBinaryData(Name, Result, SizeOf(TDateTime));
  274. Result:=Frac(Result);
  275. end;
  276. procedure TRegistry.WriteBinaryData(const Name: string; var Buffer; BufSize: Integer);
  277. begin
  278. PutData(Name, @Buffer, BufSize, rdBinary);
  279. end;
  280. procedure TRegistry.WriteBool(const Name: string; Value: Boolean);
  281. begin
  282. WriteInteger(Name,Ord(Value));
  283. end;
  284. procedure TRegistry.WriteCurrency(const Name: string; Value: Currency);
  285. begin
  286. WriteBinaryData(Name, Value, SizeOf(Currency));
  287. end;
  288. procedure TRegistry.WriteDate(const Name: string; Value: TDateTime);
  289. begin
  290. WriteBinarydata(Name, Value, SizeOf(TDateTime));
  291. end;
  292. procedure TRegistry.WriteTime(const Name: string; Value: TDateTime);
  293. begin
  294. WriteBinaryData(Name, Value, SizeOf(TDateTime));
  295. end;
  296. procedure TRegistry.WriteDateTime(const Name: string; Value: TDateTime);
  297. begin
  298. WriteBinaryData(Name, Value, SizeOf(TDateTime));
  299. end;
  300. procedure TRegistry.WriteExpandString(const Name, Value: string);
  301. begin
  302. PutData(Name, @Value[1], Length(Value),rdExpandString);
  303. end;
  304. procedure TRegistry.WriteFloat(const Name: string; Value: Double);
  305. begin
  306. WriteBinaryData(Name, Value, SizeOf(Double));
  307. end;
  308. procedure TRegistry.WriteInteger(const Name: string; Value: Integer);
  309. begin
  310. PutData(Name, @Value, SizeOf(Integer), rdInteger);
  311. end;
  312. procedure TRegistry.WriteString(const Name, Value: string);
  313. begin
  314. PutData(Name, @Value[1], Length(Value), rdString);
  315. end;
  316. procedure TRegistry.MoveKey(const OldName, NewName: string; Delete: Boolean);
  317. begin
  318. end;
  319. { ---------------------------------------------------------------------
  320. Include TRegIniFile implementation
  321. ---------------------------------------------------------------------}
  322. {$i regini.inc}
  323. end.