Embedding filer som ressourcer i en Delphi eksekverbar



Du kan lære at oprette din egen software til enhver situation med de fremragende Software Krav Unleashed. Hvis du har brug for at vide, hvordan man kan integrere ikoner, markører, animerede markører, bitmaps, JPEG-billeder, wave filer, tekst filer og enhver anden fil i en Delphi eksekverbar, bare holde læsning!

Embedding filer som ressourcer i en Delphi eksekverbar
Det er muligt at indlejre alle slags filer i en eksekverbar hjælp ressource-filer (* .RES). Visse typer af ressourcer er anerkendt af API og kan anvendes direkte. Andre er simpelthen taget som binære data og det er op til dig at bruge dem. I denne artikel vil vi se eksempler på begge former.

For at oprette ressource fil starter vi med kildefilen (* .RC), for eksempel ved navn RESOURCES.RC, som er en simpel tekstfil, der indeholder de ressourcemæssige poster (navn, klasse og fil):

sample_bmpBITMAP sample.bmp

sample_icoICON sample.ico

sample_curCURSOR sample.cur

sample_aniANICURSOR sample.ani

sample_jpgJPEG sample.jpg

sample_wavWAVE sample.wav

sample_txtTEXT sample.txt
Navnene på de ressourcer (sample_bmp, sample_ico, etc.) er vilkårlige. Den form for ressource, kan være godkendt af de API'er (bitmap, ikon, markøren) eller vilkårlig (JPEG, WAVE, tekst). Filnavnene specificere de filer, der vil blive inkluderet i .RES fil (og senere i .exe).

Nu er vi nødt til at oversætte den .RC fil til at producere den .RES fil. Til det kan vi bruge Borland Resource Compiler (brcc32.exe), som du sikkert kan finde i Delphi mappen BIN. Det er en simpel kommando-line utility, der forventer, at navnet på kildefilen som parameter:

C: \ DELPHI \ P0025> brcc32 ressourcer

Borland Resource Compiler Version 5.40

Copyright (c) 1990 1999 Inprise Corporation. Alle rettigheder reserveret.

C: \ DELPHI \ P0025> _
At instruere linker at indlejre ressource fil i den eksekverbare bruger vi ressource fil direktivet ($ R eller $ RESOURCE) i vores Pascal ource kode:

{$ R resources.res}
Ilægning ressourcerne i din ansøgning er nemt for de "genkendes" ressourcer som bitmap, ICON og CURSOR siden Windows API indeholder funktioner (LoadBitmap, LoadIcon og LoadCursor henholdsvis) for at få greb til disse elementer, som for eksempel kan vi tildele til håndtaget ejendom af den 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 lægger billedressourcer Se API LoadImage.

Andre ressourcer er lidt sværere at styre. Lad os starte med JPEG-billeder. Følgende funktion bruger TResourceStream at indlæse ressourcen som en strøm, der vil blive indlæst i en TJPEGImage objekt:

fungere GetResourceAsJpeg (const resname: string): TJPEGImage;

Var

Stream: TResourceStream;

begynde

Stream: = TResourceStream.Create (hInstance, ResName, 'JPEG');

prøve

Resultat: = TJPEGImage.Create;

Result.LoadFromStream (Stream);

endelig

Stream.Free;

ende;

ende;
Eksempel:

Var

Jpg: TJPEGImage;

begynde

// ...

Jpg: = GetResourceAsJpeg (»sample_jpg ');

Image2.Picture.Bitmap.Assign (jpg);

Jpg.Free;

// ...

ende;
For WAV-filer, vi har brug for en pointer til den er lagt i hukommelsen ressource, og for en tekstfil, vi har brug for at indlæse en ressource i en streng. Vi kan gøre det ved hjælp TResourceStream, men lad os se et eksempel ved hjælp af API:

funktion GetResourceAsPointer (ResName: pchar; ResType: pchar;

ud Størrelse: langtord): pointer;

Var

InfoBlock: HRSRC;

GlobalMemoryBlock: HGLOBAL;

begynde

InfoBlock: = FindResource (hInstance, resname, restype);

hvis InfoBlock er 0,

hæve Exception.Create (SysErrorMessage (GetLastError));

size: = SizeofResource (hInstance, InfoBlock);

hvis size = 0, så

hæve Exception.Create (SysErrorMessage (GetLastError));

GlobalMemoryBlock: = LoadResource (hInstance, InfoBlock);

hvis GlobalMemoryBlock = 0 så

hæve Exception.Create (SysErrorMessage (GetLastError));

Resultat: = LockResource (GlobalMemoryBlock);

hvis Resultat = nil derefter

hæve Exception.Create (SysErrorMessage (GetLastError));

ende;

funktion GetResourceAsString (ResName: pchar; ResType: pchar): string;

Var

ResData: PChar;

ResSize: langtord;

begynde

ResData: = GetResourceAsPointer (resname, restype, ResSize);

SetString (Resultat, ResData, ResSize);

ende;
Sample opkald:

Var

sample_wav: pointer;

procedure TForm1.FormCreate (Sender: TObject);

Var

størrelse: langtord;

begynde

...

sample_wav: = GetResourceAsPointer (»sample_wav ',' bølge ', størrelse);

Memo1.Lines.Text: = GetResourceAsString (»sample_txt ',' tekst ');

ende;
Når vi har den bølge ressource indlæst i hukommelsen kan vi spille det så mange gange, som vi ønsker, ved hjælp af API sndPlaySound anmeldt i MMSystem enhed:

procedure TForm1.Button1Click (Sender: TObject);

begynde

sndPlaySound (sample_wav, SND_MEMORY eller SND_NODEFAULT eller SND_ASYNC);

ende;
Der er nogle ressourcer (som skrifttyper og animerede markører), der ikke kan bruges fra hukommelsen. Vi nødvendigvis at gemme disse midler til en midlertidig disk fil og indlæse dem derfra. Følgende funktion sparer en ressource til en fil:

procedure SaveResourceAsFile (konst ResName: string; ResType: pchar;

konst FileName: string);

begynde

med TResourceStream.Create (hInstance, ResName, ResType) gør

prøve

SaveToFile (filename);

endelig

Gratis;

ende;

ende;
Følgende funktion gør brug af den foregående at gemme en ressource i en midlertidig fil:

funktion SaveResourceAsTempFile (konst ResName: string;

ResType: pchar): string;

begynde

Resultat: = CreateTempFile;

SaveResourceAsFile (ResName, ResType, resultat);

ende;
Diskussionen af ​​funktionen CreateTempFile falder uden for rammerne af denne artikel, og dens gennemførelse kan ses i eksemplet er knyttet til nyhedsbrevet.

Følgende funktion gør brug af SaveResourceAsTempFile at gemme en animeret-cursor ressource til en midlertidig fil, så indlæser markøren fra filen med LoadImage og endelig sletter den midlertidige fil. Funktionen returnerer håndtaget returneres af LoadImage:

funktion GetResourceAsAniCursor (konst ResName: string): HCursor;

Var

CursorFile: string;

begynde

CursorFile: = SaveResourceAsTempFile (ResName »ANICURSOR ');

Resultat: = LoadImage (0, PChar (CursorFile) IMAGE_CURSOR 0,

0, LR_DEFAULTSIZE eller LR_LOADFROMFILE);

DeleteFile (CursorFile);

hvis Resultat = 0 så

hæve Exception.Create (SysErrorMessage (GetLastError));

ende;
Prøve opkald:

Screen.Cursors [1]: = GetResourceAsAniCursor (»sample_ani ');

Form1.Cursor: = 1;
Tja, det er det. Jeg håber du finder det nyttigt. Du kan finde mere information om ressource-filer i MSDN Library:

http://msdn.microsoft.com/library/en-us/winui/hh/winui/rc_6cs3.asp

Du kan finde den fulde kildekode til denne artikel i arkivet, der følger med Pascal Nyhedsbrev # 25.

Relaterede artikler