registry.pp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  1. Unit registry;
  2. {$mode objfpc}
  3. {$H+}
  4. interface
  5. {$ifndef windows}
  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. fPath : String;
  117. public
  118. constructor Create(const FN: string);
  119. function ReadString(const Section, Ident, Default: string): string;
  120. function ReadInteger(const Section, Ident: string;
  121. Default: Longint): Longint;
  122. function ReadBool(const Section, Ident: string; Default: Boolean): Boolean;
  123. procedure WriteString(const Section, Ident, Value: String);
  124. procedure WriteInteger(const Section, Ident: string; Value: Longint);
  125. procedure WriteBool(const Section, Ident: string; Value: Boolean);
  126. procedure ReadSection(const Section: string; Strings: TStrings);
  127. procedure ReadSections(Strings: TStrings);
  128. procedure ReadSectionValues(const Section: string; Strings: TStrings);
  129. procedure EraseSection(const Section: string);
  130. procedure DeleteKey(const Section, Ident: String);
  131. property FileName: String read fFileName;
  132. end;
  133. ResourceString
  134. SInvalidRegType = 'Invalid registry data type: "%s"';
  135. SRegCreateFailed = 'Failed to create key: "%s"';
  136. SRegSetDataFailed = 'Failed to set data for value "%s"';
  137. SRegGetDataFailed = 'Failed to get data for value "%s"';
  138. implementation
  139. { ---------------------------------------------------------------------
  140. Include implementation-dependent code
  141. ---------------------------------------------------------------------}
  142. {$ifdef XMLREG}
  143. {$i xregreg.inc}
  144. {$else}
  145. {$i winreg.inc}
  146. {$endif}
  147. { ---------------------------------------------------------------------
  148. Generic, implementation-independent code.
  149. ---------------------------------------------------------------------}
  150. Constructor TRegistry.Create;
  151. begin
  152. inherited Create;
  153. FAccess := KEY_ALL_ACCESS;
  154. FRootKey := HKEY_CURRENT_USER;
  155. FLazyWrite := True;
  156. FCurrentKey := 0;
  157. SysRegCreate;
  158. end;
  159. Constructor TRegistry.Create(aaccess:longword);
  160. begin
  161. Create;
  162. FAccess := aaccess;
  163. end;
  164. Destructor TRegistry.Destroy;
  165. begin
  166. CloseKey;
  167. SysRegFree;
  168. inherited Destroy;
  169. end;
  170. function TRegistry.CreateKey(const Key: String): Boolean;
  171. begin
  172. Result:=SysCreateKey(Key);
  173. If Not Result Then
  174. Raise ERegistryException.CreateFmt(SRegCreateFailed, [Key]);
  175. end;
  176. function TRegistry.GetBaseKey(Relative: Boolean): HKey;
  177. begin
  178. If Relative and (CurrentKey<>0) Then
  179. Result := CurrentKey
  180. else
  181. Result := RootKey;
  182. end;
  183. function TRegistry.GetData(const Name: String; Buffer: Pointer;
  184. BufSize: Integer; var RegData: TRegDataType): Integer;
  185. begin
  186. Result:=SysGetData(Name,Buffer,BufSize,RegData);
  187. If (Result=-1) then
  188. Raise ERegistryException.CreateFmt(SRegGetDataFailed, [Name]);
  189. end;
  190. procedure TRegistry.PutData(const Name: string; Buffer: Pointer;
  191. BufSize: Integer; RegData: TRegDataType);
  192. begin
  193. If Not SysPutData(Name,Buffer,BufSize,RegData) then
  194. Raise ERegistryException.CreateFmt(SRegSetDataFailed, [Name]);
  195. end;
  196. function TRegistry.GetDataSize(const ValueName: String): Integer;
  197. Var
  198. Info: TRegDataInfo;
  199. begin
  200. If GetDataInfo(ValueName,Info) Then
  201. Result := Info.DataSize
  202. else
  203. Result := -1;
  204. end;
  205. function TRegistry.GetDataType(const ValueName: string): TRegDataType;
  206. Var
  207. Info: TRegDataInfo;
  208. begin
  209. GetDataInfo(ValueName, Info);
  210. Result:=Info.RegData;
  211. end;
  212. Function TRegistry.HasSubKeys: Boolean;
  213. Var
  214. Info : TRegKeyInfo;
  215. begin
  216. Result:=GetKeyInfo(Info);
  217. If Result then
  218. Result:=(Info.NumSubKeys>0);
  219. end;
  220. function TRegistry.ReadBinaryData(const Name: string; var Buffer; BufSize: Integer): Integer;
  221. Var
  222. RegDataType: TRegDataType;
  223. begin
  224. Result := GetData(Name, @Buffer, BufSize, RegDataType);
  225. If (RegDataType<>rdBinary) Then
  226. Raise ERegistryException.CreateFmt(SInvalidRegType, [Name]);
  227. end;
  228. function TRegistry.ReadInteger(const Name: string): Integer;
  229. Var
  230. RegDataType: TRegDataType;
  231. begin
  232. GetData(Name, @Result, SizeOf(Integer), RegDataType);
  233. If RegDataType<>rdInteger Then
  234. Raise ERegistryException.CreateFmt(SInvalidRegType, [Name]);
  235. end;
  236. function TRegistry.ReadBool(const Name: string): Boolean;
  237. begin
  238. Result:=ReadInteger(Name)<>0;
  239. end;
  240. function TRegistry.ReadCurrency(const Name: string): Currency;
  241. Var
  242. RegDataType: TRegDataType;
  243. begin
  244. ReadBinaryData(Name, Result, SizeOf(Currency));
  245. end;
  246. function TRegistry.ReadDate(const Name: string): TDateTime;
  247. begin
  248. ReadBinaryData(Name, Result, SizeOf(TDateTime));
  249. Result:=Trunc(Result);
  250. end;
  251. function TRegistry.ReadDateTime(const Name: string): TDateTime;
  252. Var
  253. RegDataType: TRegDataType;
  254. begin
  255. ReadBinaryData(Name, Result, SizeOf(TDateTime));
  256. end;
  257. function TRegistry.ReadFloat(const Name: string): Double;
  258. begin
  259. ReadBinaryData(Name,Result,SizeOf(Double));
  260. end;
  261. function TRegistry.ReadString(const Name: string): string;
  262. Var
  263. Info : TRegDataInfo;
  264. begin
  265. GetDataInfo(Name,Info);
  266. if info.datasize>0 then
  267. begin
  268. If Not (Info.RegData in [rdString,rdExpandString]) then
  269. Raise ERegistryException.CreateFmt(SInvalidRegType, [Name]);
  270. SetLength(Result,Info.DataSize);
  271. If StringSizeIncludesNull then
  272. SetLength(Result, Info.DataSize-1)
  273. else
  274. SetLength(Result, Info.DataSize);
  275. GetData(Name,@Result[1],Info.DataSize,Info.RegData);
  276. end
  277. else
  278. result:='';
  279. end;
  280. function TRegistry.ReadTime(const Name: string): TDateTime;
  281. begin
  282. ReadBinaryData(Name, Result, SizeOf(TDateTime));
  283. Result:=Frac(Result);
  284. end;
  285. procedure TRegistry.WriteBinaryData(const Name: string; var Buffer; BufSize: Integer);
  286. begin
  287. PutData(Name, @Buffer, BufSize, rdBinary);
  288. end;
  289. procedure TRegistry.WriteBool(const Name: string; Value: Boolean);
  290. begin
  291. WriteInteger(Name,Ord(Value));
  292. end;
  293. procedure TRegistry.WriteCurrency(const Name: string; Value: Currency);
  294. begin
  295. WriteBinaryData(Name, Value, SizeOf(Currency));
  296. end;
  297. procedure TRegistry.WriteDate(const Name: string; Value: TDateTime);
  298. begin
  299. WriteBinarydata(Name, Value, SizeOf(TDateTime));
  300. end;
  301. procedure TRegistry.WriteTime(const Name: string; Value: TDateTime);
  302. begin
  303. WriteBinaryData(Name, Value, SizeOf(TDateTime));
  304. end;
  305. procedure TRegistry.WriteDateTime(const Name: string; Value: TDateTime);
  306. begin
  307. WriteBinaryData(Name, Value, SizeOf(TDateTime));
  308. end;
  309. procedure TRegistry.WriteExpandString(const Name, Value: string);
  310. begin
  311. PutData(Name, @Value[1], Length(Value),rdExpandString);
  312. end;
  313. procedure TRegistry.WriteFloat(const Name: string; Value: Double);
  314. begin
  315. WriteBinaryData(Name, Value, SizeOf(Double));
  316. end;
  317. procedure TRegistry.WriteInteger(const Name: string; Value: Integer);
  318. begin
  319. PutData(Name, @Value, SizeOf(Integer), rdInteger);
  320. end;
  321. procedure TRegistry.WriteString(const Name, Value: string);
  322. begin
  323. PutData(Name, @Value[1], Length(Value), rdString);
  324. end;
  325. procedure TRegistry.MoveKey(const OldName, NewName: string; Delete: Boolean);
  326. begin
  327. end;
  328. { ---------------------------------------------------------------------
  329. Include TRegIniFile implementation
  330. ---------------------------------------------------------------------}
  331. {$i regini.inc}
  332. end.