[ Pobierz całość w formacie PDF ]
.Mo¿na stworzyæ biblioteki DLL zawieraj¹ce zasoby³añcuchów w kilku ró¿nych jêzykach, a nastêpnie po prostu wczytywaæ odpowiedni¹bibliotekê w zale¿noœci od wyboru dokonanego przez u¿ytkownika.Kod wykonuj¹cyto zadanie móg³by wygl¹daæ nastêpuj¹co:varDLLName : String;begincase Language oflaFrench : DllName := 'french.dll';laGerman : DllName := 'german.dll';laSpanish: DllName := 'spanish.dll';laEnglish: DllName := 'english.dll';end;DllInstance := LoadLibrary(PChar(dllName));end;Wystarczy za³adowaæ odpowiedni¹ bibliotekê DLL; reszta kodu pozostaje bez zmian(oczywiœcie przy za³o¿eniu, ¿e ³añcuchy w ka¿dej z bibliotek DLL posiadaj¹takie same identyfikatory).Jest to tylko jeden przyk³ad wykorzystaniabibliotek do przechowywania zasobów.Na pewno znajdziesz wiele innychzastosowañ dla tej techniki.Tworzenie biblioteki zasobówMo¿na stworzyæ bibliotekê DLL zawieraj¹c¹ tylko zasoby, lub bibliotekêzawieraj¹c¹ zasoby i kod wykonywalny.Umieszczanie zasobów w bibliotece jestbardzo podobne do umieszczania ich w aplikacji.Aby stworzyæ bibliotekêzasobów, zainicjuj nowy projekt biblioteki DLL, a nastêpnie dodaj liniê kodudo³¹czaj¹c¹ plik zasobów:{$R RESOURC.RES}Oto ca³y proces tworzenia biblioteki zasobów.Tworzenie plików zasobów by³oomawiane w rozdziale ósmym.Wykorzystanie biblioteki zasobówZanim bêdzie mo¿na skorzystaæ z zasobów biblioteki, trzeba utworzyæ uchwyt dojej egzemplarza.Je¿eli w bibliotece znajduj¹ siê tylko zasoby, bibliotekêbêdziemy ³adowaæ dynamicznie.Jeœli znajduj¹ siê w niej zasoby i kod, mo¿nawybraæ ³adowanie statyczne.Nawet w wypadku statycznego wczytania biblioteki,trzeba bêdzie wywo³aæ funkcjê LoadLibrary, aby uzyskaæ interesuj¹cy nasuchwyt:DllInstance := LoadLibrary('resource.dll');Od tego momentu mo¿na korzystaæ z uchwytu wszêdzie tam, gdzie oka¿e siê toniezbêdne.Znajduj¹cy siê poni¿ej kod wczytuje bitmapê przechowywan¹ jako zasóbw bibliotece DLL do komponentu Image:procedure TMainForm.FormCreate(Sender : TObject);beginDLLInstance := LoadLibrary('resource.dll');if DLLInstance 0 then beginImage.Picture.Bitmap.LoadFromResourceName(DLLInstance, 'ID_BITMAP1');FreeLibrary(DLLInstance);end elseMessageDlg('B³¹d przy wczytywaniu biblioteki DLL.',mtError, [mbOk], 0);end;Tak naprawdê niewiele wiêcej mo¿na powiedzieæ na ten temat.Powtarzam –biblioteka zasobów mo¿e zostaæ wczytana statycznie lub dynamicznie.Niezale¿nieod sposobu jej wczytania trzeba u¿yæ funkcji LoadLibrary, aby uzyskaæ uchwyt dobiblioteki.Nie zapomnij wywo³aæ funkcji FreeLibrary, aby zwolniæ bibliotekê,kiedy nie bêdzie ona ju¿ potrzebna lub gdy zakoñczona zostanie aplikacja.Pamiêtasz program JumpingJack z rozdzia³u ósmego? Na dyskietce do³¹czonej doksi¹¿ki znajduje siê wersja tego programu, która wczytuje z biblioteki DLLzasoby w postaci bitmapy, dŸwiêku i ³añcuchów.Jest to przyk³ad wykorzystaniazasobów zapisanych w bibliotece DLL.Dynamiczne ³adowanie bibliotek posiada tê zaletê, i¿ pozwala aplikacjom naszybsze wczytywanie siê.W wielu przypadkach zasoby biblioteki DLL s¹ czytywanetylko wtedy, gdy zachodzi taka potrzeba i usuwane, kiedy ich obecnoœæ nie jestd³u¿ej wymagana.W rezultacie aplikacja zu¿ywa mniej pamiêci ni¿ w przypadku,gdy zasoby s¹ przechowywane w pliku wykonywalnym.Wad¹ statycznego ³adowaniajest to, ¿e u¿ytkownicy mog¹ zauwa¿yæ krótk¹ przerwê w chwili ³adowaniabiblioteki DLL.Próbuj przewidywaæ mo¿liwe zachowanie aplikacji i ³adujbibliotekê w takim momencie, aby zauwa¿enie tego procesu jest najmniejprawdopodobne.PodsumowanieKorzystanie z bibliotek DLL nie jest tak trudne, jak to siê mo¿e wydawaæ napierwszy rzut oka.Biblioteki dynamiczne s¹ doskona³ym œrodkiem wielokrotnegou¿ycia kodu.Po stworzeniu biblioteki DLL mo¿na wykorzystywaæ j¹ przez wieleaplikacji jednoczeœnie.Niezwykle u¿yteczn¹ cech¹ jest mo¿liwoœæ umieszczania wbibliotekach formularzy VCL, a nastêpnie wywo³ywania ich z aplikacjipochodz¹cych spoza œrodowiska Delphi.Oznacza to, ¿e mo¿esz tworzyæ formularze,które nastêpnie bêd¹ mog³y byæ wywo³ywane z niemal ka¿dego typu aplikacjiWindows, niezale¿nie od tego czy do ich stworzenia pos³u¿y³ jêzyk C, VisualBasic, MFC, OWL czy jeszcze inny.Wykorzystanie bibliotek DLL do przechowywaniazasobów okazuje siê efektywne, je¿eli budowana aplikacji korzysta z du¿ej ichiloœci, a my chcemy kontrolowaæ kiedy i gdzie te zasoby powinny byæwczytywane.WarsztatWarsztat sk³ada siê z pytañ kontrolnych oraz æwiczeñ utrwalaj¹cych ipog³êbiaj¹cych zdobyt¹ wiedzê.Odpowiedzi do pytañ mo¿esz znaleŸæ w dodatku A.Pytania i odpowiedzi* Mój program jest bardzo ma³y, dlatego nie widzê potrzeby stosowania bibliotekDLL.Czy powinienem zatem ponownie rozwa¿yæ jego strukturê?Prawdopodobnie nie.W przypadku ma³ych aplikacji stosowanie bibliotek DLLzazwyczaj nie jest potrzebne.Gdyby okaza³o siê, ¿e zbudowa³eœ klasê, któranadaje siê do wielokrotnego wykorzystania, wtedy móg³byœ skorzystaæ zbiblioteki DLL.Jednak w normalnych warunkach nie warto trudziæ siê budowaniembibliotek DLL dla rzeczywiœcie ma³ych aplikacji
[ Pobierz całość w formacie PDF ]