123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- {
- This file is part of the Free Pascal run time library.
- Copyright (c) 2008 by Giulio Bernardi
- Resource reader for TLB files
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- **********************************************************************}
- unit tlbreader;
- {$MODE OBJFPC} {$H+}
- interface
- uses
- Classes, SysUtils, resource;
- type
- { TTlbResourceReader }
- TTlbResourceReader = class (TAbstractResourceReader)
- private
- dummyType : TResourceDesc;
- dummyName : TResourceDesc;
- protected
- function GetExtensions : string; override;
- function GetDescription : string; override;
- procedure Load(aResources : TResources; aStream : TStream); override;
- function CheckMagic(aStream : TStream) : boolean; override;
- public
- constructor Create; override;
- destructor Destroy; override;
- end;
- implementation
- uses
- resdatastream, resfactory;
- type
- TSignature = array[0..3] of char;
- const
- TypeLibSig1 = 'MSFT';
- TypeLibSig2 = 'SLTG';
- { TTlbResourceReader }
- function TTlbResourceReader.GetExtensions: string;
- begin
- Result:='.tlb';
- end;
- function TTlbResourceReader.GetDescription: string;
- begin
- Result:='TLB resource reader';
- end;
- procedure TTlbResourceReader.Load(aResources: TResources; aStream: TStream);
- var aRes : TAbstractResource;
- RawData : TResourceDataStream;
- begin
- if not CheckMagic(aStream) then
- raise EResourceReaderWrongFormatException.Create('');
- aRes:=TResourceFactory.CreateResource(dummyType,dummyName);
- SetDataSize(aRes,aStream.Size-aStream.Position);
- SetDataOffset(aRes,aStream.Position);
- RawData:=TResourceDataStream.Create(aStream,aRes,aRes.DataSize,TCachedResourceDataStream);
- SetRawData(aRes,RawData);
- try
- dummyName.ID := aResources.AddAutoID(aRes);
- except
- on e : EResourceDuplicateException do
- begin
- aRes.Free;
- raise;
- end;
- end;
- end;
- function TTlbResourceReader.CheckMagic(aStream: TStream): boolean;
- var sig : TSignature;
- orig : int64;
- begin
- orig:=aStream.Position;
- aStream.ReadBuffer(sig,4);
- Result := (sig=TypeLibSig1) or (sig=TypeLibSig2);
- aStream.Position:=orig;
- end;
- constructor TTlbResourceReader.Create;
- begin
- dummyType:=TResourceDesc.Create;
- dummyType.Name:='TYPELIB';
- dummyName:=TResourceDesc.Create;
- dummyName.ID:=1;
- end;
- destructor TTlbResourceReader.Destroy;
- begin
- dummyType.Free;
- dummyName.Free;
- end;
- initialization
- TResources.RegisterReader('.tlb',TTlbResourceReader);
- end.
|