Embedding filer som ressurser i en Delphi executable

Du kan lære å lage din egen programvare for enhver situasjon med den utmerkede Programvarekrav Unleashed
. Hvis du trenger å vite hvordan du skal legge ned ikoner, pekere, animerte markører, punktgrafikk, JPEG-bilder, wave filer, tekstfiler og andre filer inne i en Delphi kjørbar, bare fortsett å lese!
Bygge inn filer som ressurser i en Delphi kjørbar Det er mulig å legge ned alle typer filer i en kjørbar ved hjelp av ressursfiler (* Res). Visse typer ressurser er anerkjent av API og kan brukes direkte. Andre er rett og slett tatt som binære data og det er opp til deg å bruke dem. I denne artikkelen vil vi se eksempler på begge typer.
Å skape ressursfilen starter vi med kildefilen (* .RC), for eksempel heter RESOURCES.RC, som er en enkel tekstfil som inneholder ressursoppføringer ( navn, klasse og fil):
sample_bmp BITMAP sample.bmp
sample_ico ICON sample.ico
sample_cur CURSOR sample.cur
sample_ani ANICURSOR sample.ani
sample_jpg JPEG sample.jpg
sample_wav WAVE sample.wav
sample_txt TEKST sample.txt navnene på de ressurser (sample_bmp, sample_ico, etc.) er vilkårlig. Den type ressurs kan en anerkjent av APIer (punktgrafikk, ICON, markør) eller vilkårlig (JPEG, WAVE, tekst). Filnavnene spesifisere hvilke filer som vil bli inkludert i res fil (og senere i .EXE).
Nå må vi kompilere .RC fil å produsere res filen. For at vi kan bruke Borland Resource Compiler (brcc32.exe) at du kan sikkert finne i BIN-mappen Delphis. Det er en enkel kommandolinjeverktøy som forventer navnet på kildefilen som parameter:
C: \\ DELPHI \\ P0025 > brcc32 ressurser
Borland Resource Compiler versjon 5.40
Copyright (c) 1990, 1999 Inprise Corporation . Alle rettigheter reservert
C:. \\ DELPHI \\ P0025 > _ å instruere linker å bygge inn ressursfilen i den kjørbare, bruker vi ressursfilen direktivet ($ R eller $ RESSURS) i vår Pascal ource kode:
{$ R resources.res} Legge ressursene i programmet er lett for " recongnized " ressurser som punktgrafikk, ICON og CURSOR siden Windows API gir funksjoner (LoadBitmap, LoadIcon og LoadCursor henholdsvis) for å få håndtak for disse elementene, som for eksempel kan vi tildele til håndtaket eiendom av tilsvarende objekt:
Image1.Picture. Bitmap.Handle: =
LoadBitmap (hInstance, 'sample_bmp');
Icon.Handle: = LoadIcon (hInstance, 'sample_ico');
Screen.Cursors [1]: = LoadCursor (hInstance, ' sample_cur '); For flere alternativer når du legger bilde ressurser, se API LoadImage.
Andre ressurser er litt vanskeligere å håndtere. La oss starte med JPEG-bilder. Følgende funksjonen bruker TResourceStream å laste ressursen som en strøm som vil bli lastet inn i en TJPEGImage objekt:
funksjon GetResourceAsJpeg (konst resname: string): TJPEGImage;
Var
Stream: TResourceStream;
begynne
Stream: = TResourceStream.Create (hInstance, ResName, 'JPEG');
prøve
Resultat: = TJPEGImage.Create;
Result.LoadFromStream (Stream);
endelig Stream.Free,
ende;
ende; Eksempel:
Var
Jpg: TJPEGImage;
begynne
//...
Jpg: = GetResourceAsJpeg ( 'sample_jpg');
Image2.Picture.Bitmap.Assign (Jpg ),
Jpg.Free;
//...
slutten; For WAV-filer trenger vi en peker til ressursen lastet inn i minnet, og for en tekstfil vi må legge en ressurs i en streng. Vi kan gjøre det ved hjelp TResourceStream, men la oss se et eksempel med API:
funksjon GetResourceAsPointer (ResName: pchar; ResType: pchar;
ut Størrelse: Long): pekeren;
Var
InfoBlock: HRSRC;
GlobalMemoryBlock: HGLOBAL;
begynne
InfoBlock: = FindResource (hInstance, resname, restype);
hvis InfoBlock = 0 da
heve Exception.Create (SysErrorMessage (GetLastError));
size: = SizeofResource (hInstance, InfoBlock);
hvis size = 0 da
heve Exception.Create (SysErrorMessage (GetLastError));
GlobalMemoryBlock: = LoadResource (hInstance, InfoBlock);
hvis GlobalMemoryBlock = 0 da
heve Exception.Create (SysErrorMessage (GetLastError));
Resultat: = LockResource (GlobalMemoryBlock);
hvis Resultat = null da
heve Exception.Create (SysErrorMessage (GetLastError ));
ende;
funksjon GetResourceAsString (ResName: pchar; ResType: pchar): string;
Var
ResData: pChar;
ResSize: Long;
begynne
ResData: = GetResourceAsPointer (resname, restype, ResSize),
SetString (Resultat, ResData, ResSize);
ende; Eksempel på anrop:
Var
sample_wav: pekeren;
prosedyre TForm1.FormCreate (Sender: TObject);
Var
størrelse: Long;
begynne
...
sample_wav: = GetResourceAsPointer ( 'sample_wav', 'bølge', størrelse);
Memo1.Lines.Text: = GetResourceAsString ( 'sample_txt', 'tekst');
ende; Når vi har bølgen ressurs lastet inn i minnet kan vi spille det så mange ganger som vi ønsker ved hjelp av API sndPlaySound deklarert i MMSystem enhet:
prosedyre TForm1.Button1Click (Sender: TObject);
begynne
sndPlaySound (sample_wav, SND_MEMORY eller SND_NODEFAULT eller SND_ASYNC);
ende; Det er noen ressurser (som fonter og animerte musepekere) som ikke kan brukes fra minnet. Vi nødvendigvis trenger å spare disse ressursene til en midlertidig fil på harddisken og last dem derfra. Følgende funksjon sparer en ressurs til en fil:
prosedyre SaveResourceAsFile (konst ResName: string; ResType: pchar;
const Filename: string);
begynne
med TResourceStream.Create (hInstance, ResName, ResType) gjør
prøve
SaveToFile (Filename);
endelig Kanal Gratis,
ende;
ende; Følgende funksjon gjør bruk av den forrige å lagre en ressurs i en midlertidig fil:
funksjon SaveResourceAsTempFile (konst ResName: string;
ResType: pchar): string;
begynne
Resultat: = CreateTempFile;
SaveResourceAsFile (ResName, ResType, Result);
ende; Diskusjonen av funksjonen CreateTempFile faller utenfor omfanget av denne artikkelen og gjennomføringen kan sees i eksempelet festet på nyhetsbrevet.
Følgende funksjon gjør bruk av SaveResourceAsTempFile å lagre en animert-markøren ressurs til en midlertidig fil, deretter den laster markøren fra filen med LoadImage og til slutt sletter den midlertidige filen. Funksjonen returnerer håndtaket som returneres av LoadImage:
funksjon GetResourceAsAniCursor (konst ResName: string): HCursor;
Var
CursorFile: string;
begynne
CursorFile: = SaveResourceAsTempFile (ResName, 'ANICURSOR ');
Resultat: = LoadImage (0, PChar (CursorFile), IMAGE_CURSOR, 0, etter 0, LR_DEFAULTSIZE eller LR_LOADFROMFILE),
DeleteFile (CursorFile);
hvis Resultat = 0 da
heve Exception.Create (SysErrorMessage (GetLastError));
ende; Eksempel samtale:
Screen.Cursors [1]: = GetResourceAsAniCursor ( 'sample_ani');
Form1.Cursor: = 1; Vel, det er det. Jeg håper du finner det nyttig. Du kan finne mer informasjon om ressursfiler i MSDN Library:
http://msdn.microsoft.com/library/en-us/winui/hh/winui/rc_6cs3.asp
Du finner hele kilde koden til denne artikkelen i arkivet som følger med Pascal Nyhetsbrev # 25.



Previous: