tlbreader.pp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 2008 by Giulio Bernardi
  4. Resource reader for TLB files
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. unit tlbreader;
  12. {$MODE OBJFPC} {$H+}
  13. interface
  14. uses
  15. Classes, SysUtils, resource;
  16. type
  17. { TTlbResourceReader }
  18. TTlbResourceReader = class (TAbstractResourceReader)
  19. private
  20. dummyType : TResourceDesc;
  21. dummyName : TResourceDesc;
  22. protected
  23. function GetExtensions : string; override;
  24. function GetDescription : string; override;
  25. procedure Load(aResources : TResources; aStream : TStream); override;
  26. function CheckMagic(aStream : TStream) : boolean; override;
  27. public
  28. constructor Create; override;
  29. destructor Destroy; override;
  30. end;
  31. implementation
  32. uses
  33. resdatastream, resfactory;
  34. type
  35. TSignature = array[0..3] of char;
  36. const
  37. TypeLibSig1 = 'MSFT';
  38. TypeLibSig2 = 'SLTG';
  39. { TTlbResourceReader }
  40. function TTlbResourceReader.GetExtensions: string;
  41. begin
  42. Result:='.tlb';
  43. end;
  44. function TTlbResourceReader.GetDescription: string;
  45. begin
  46. Result:='TLB resource reader';
  47. end;
  48. procedure TTlbResourceReader.Load(aResources: TResources; aStream: TStream);
  49. var aRes : TAbstractResource;
  50. RawData : TResourceDataStream;
  51. begin
  52. if not CheckMagic(aStream) then
  53. raise EResourceReaderWrongFormatException.Create('');
  54. aRes:=TResourceFactory.CreateResource(dummyType,dummyName);
  55. SetDataSize(aRes,aStream.Size-aStream.Position);
  56. SetDataOffset(aRes,aStream.Position);
  57. RawData:=TResourceDataStream.Create(aStream,aRes,aRes.DataSize,TCachedResourceDataStream);
  58. SetRawData(aRes,RawData);
  59. try
  60. dummyName.ID := aResources.AddAutoID(aRes);
  61. except
  62. on e : EResourceDuplicateException do
  63. begin
  64. aRes.Free;
  65. raise;
  66. end;
  67. end;
  68. end;
  69. function TTlbResourceReader.CheckMagic(aStream: TStream): boolean;
  70. var sig : TSignature;
  71. orig : int64;
  72. begin
  73. orig:=aStream.Position;
  74. aStream.ReadBuffer(sig,4);
  75. Result := (sig=TypeLibSig1) or (sig=TypeLibSig2);
  76. aStream.Position:=orig;
  77. end;
  78. constructor TTlbResourceReader.Create;
  79. begin
  80. dummyType:=TResourceDesc.Create;
  81. dummyType.Name:='TYPELIB';
  82. dummyName:=TResourceDesc.Create;
  83. dummyName.ID:=1;
  84. end;
  85. destructor TTlbResourceReader.Destroy;
  86. begin
  87. dummyType.Free;
  88. dummyName.Free;
  89. end;
  90. initialization
  91. TResources.RegisterReader('.tlb',TTlbResourceReader);
  92. end.