Delphi - Hang és videó lejátszása DLL-ből

forráskód letöltése
Ebben a példában készítünk egy DLL állományt, amelyben erőforrásként eltárolunk egy AVI és egy WAV állományt. A DLL-ben létrehozunk egy-egy függvényt az erőforrások kívülről történő eléréséhez. A függvények segítségével az erőforrások tartalmát a függvények visszatérési értékében adjuk át, hogy azokat többféle módon felhasználhassuk.
Első lépésben létre kell hoznunk egy RC állományt, amelyből erőforrást készíthetünk. Az AVI, WAV és a létrejövő RC állományokat helyezzük el ugyanabban a könyvtárban. Az RC állományban kell felsorolnunk az erőforrásokat. Az állomány neve bármi lehet, a mellékelt példaprogramban a Resources.RC elnevezést használtuk.
TESTSND WAVE TestSnd.wav
COOL AVI Cool.avi
Az első helyen az erőforrás leendő neve szerepel, a másodikon a típusa, az utolsón pedig a jelenlegi fizikai állomány neve található.
A Delphi Bin alkönyvtárában található a BRCC32.EXE nevű program, amely az RC állományt lefordítja RES kiterjesztésű, erőforrás állománnyá. Ennek a programnak paraméterként az RC állomány elérési útját és nevét kell megadni.
Hozzunk létre egy új DLL-t.
A létrejövő forráskódban helyezzük el az alábbi sort.
{$R resources.res}
Ezzel az erőforrások a DLL fordításakor bekerülnek a DLL állományba.
Az erőforrások kívülről történő eléréséhez egy-egy interfész függvényt kell biztosítanunk.
function GetAVI: TMemoryStream; stdcall;
function GetSound: TMemoryStream; stdcall;
Mindkét esetben egy TMemoryStream-et használunk az erőforrás átadására. A két függvényben ugyanazokat a lépéseket kell elvégezni, csak az erőforrások különböznek. Az erőforrások megkereséséhez THandle típusú változók használata is szükséges. Ez a típus a Windows unitban van implementálva.
Egy erőforrást a FindResource függvény segítségével kereshetünk meg.
h:=FindResource(HInstance,'COOL','AVI');
Ha az erőforrás létezik, akkor a LoadResource függvénnyel lekérdezhetjük annak azonosítóját, a SizeOfResource függvénnyel pedig annak méretét.
r:=LoadResource(HInstance,h);
Si:=SizeOfResource(HInstance,r);
Létre kell hoznunk egy mutatót, amely a kiválasztott erőforrásra fog mutatni.
p:=LockResource(r);
Ezután az erőforrás tartalmát egy TMemoryStream segítségével, a függvény visszatérési értékeként átadhatjuk.
Stream:=TMemoryStream.Create;
Stream.Write(p^,Si);
Stream.Seek(0,soFromBeginning);
Result:=Stream;
Ha elkészítettük a két függvényt, az exports kulcsszó után fel kell sorolnunk azok neveit, hogy kívülről elérhetővé váljanak.
exports
  GetAVI, GetSound;
A DLL önmagában nem futtatható, a Project menü bármelyik Compile menüpontjával lefordíthatjuk.
A DLL-t felhasználó alkalmazásban fel kell vennünk a függvényhivatkozásokat.
function GetSound: TMemoryStream; stdcall; external 'WAV_AVI.dll';
function GetAVI: TMemoryStream; stdcall; external 'WAV_AVI.dll';
Az erőforrásokat egy egyszerű értékadással lekérdezhetjük. A TMemoryStream objektumok létrehozásáról a DLL-ben már gondoskodtunk.
Stream:=GetAVI;
A DLL-ben eltárolt videót és hangot tetszőleges módon felhasználhatjuk. A mellékelt példaprogramban TAnimate és TMediaPlayer komponensek segítségével játsszuk le őket.