registry.pp 12 KB

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