Maxius Opublikowano 5 Czerwca 2008 Udostępnij Opublikowano 5 Czerwca 2008 W tym artykule mam zamiar omówić wszystkie najważniejsze pojęcia dotyczące bibliotek DLL - sposobu ich pisania, wykorzystanie, łączenie z programem itp. Zacznijmy więc. Biblioteka DLL DLL to skrót do Dynamic Link Library i jest to plik, w którym znajduje się skompilowany kod źródłowy, który to może być później wykorzystany w połączeniu z aplikacją. Dobrze, już wiesz, że biblioteka dll może zawierać procedury, które możesz wykorzystać w swoim programie. Teraz pewnie zapytasz: "Po co właściwie wykorzystywać biblioteki, skoro kod można zawrzeć w pliku wykonywalnym EXE?". Dobre pytanie i kilka różnych odpowiedzi. DLL może być wykorzystany przez wszystkie języki programowania. Tak więc pisząc bibliotekę w C++ Builder możesz ją wykorzystać w Delphi. Jest to duża zaleta. Przykładem może być tutaj biblioteka do odtwarzania plików mp3 - jest ona napisana w C++, a możesz ją wykorzystać w Delphi. Innym przykładem może być funkcja DrawText lub ShellExecute, z których pewnie często korzystasz. Tak naprawdę są to funkcje importowane z bibliotek DLL dostarczonych wraz z Windowsem. Tak więc funkcje DrawText i ShellExecute są funkcjami Windowsowymi. Inny przykład. Każda aplikacja posiada błędy i nie można się ustrzec. Możesz w swoim programie częśc koduumieścić w bibliotece DLL, a część w pliku EXE. Teraz jeżeli wykryjesz jakiś błąd to wystarczy, że wymienisz tylko plik DLL, a nie cały program. Dobra przejdźmy do konkretów. Żeby stworzyć bibliotekę DLL należy z menu File wybrać New, a następnie w oknie, które się pojawi kliknąć na ikonę z napisem DLL. Otworzy się nowy projekt, a w nim: library Project1; { Important note about DLL memory management: ShareMem must be the first unit in your library's USES clause AND your project's (select View-Project Source) USES clause if your DLL exports any procedures or functions that pass strings as parameters or function results. This applies to all strings passed to and from your DLL--even those that are nested in records and classes. ShareMem is the interface unit to the DELPHIMM.DLL shared memory manager, which must be deployed along with your DLL. To avoid using DELPHIMM.DLL, pass string information using PChar or ShortString parameters. } uses SysUtils, Classes; begin end. Obszerny komentarz omówię później. Doprowadź wygląd biblioteki do takiej postaci: library Project1; uses Windows; //<-- wystarczy tylko ten moduł procedure ShowWindow; stdcall; begin MessageBox(0, 'Witaj! Jestem procedurą z biblioteki DLL!', 'Witam!', MB_OK); end; exports // eksportuj procedurę ShowWindow name 'ShowWindow'; begin end. Jak widzisz w bibliotekach nie kładzie się komponentów, ale jedynie pisze. Dobra, mamy jedną procedurę. Zauważ klauzurę exports u dołu biblioteki. Otóż po tym słowie wpisuje się nazwy procedur, które zostaną eksportowane "na zewnątrz" tzn., będzie możliwe ich wykorzystanie poza biblioteką. Eksportowanie procedur i funkcji Tak jak mówiłem - po słowie exports wypisuje się procedury i funkcje, które będą eksportowane. Jeżeli masz więcej niż jedną procedurę do eksportu wypisujesz je po przecinku: exports Procedura, JakasFunkcja; Istnieje możliwość eksportowania procedur poprzez nazwę. Znaczy to, że procedura eksportowana może mieć inną nazwę - np: exports JakasEksportowanaProcedura name 'Go'; ' W tym wypadku eksportowaliśmy procedurę JakasEksportowanaProcedura, ale eksportowaliśmy ją pod nazwą Go. Istnieje także możliwość eksportowania procedur poprzez indeks: exports JakasEksportowanaProcedura index 1, JakasEksportowanaProcedura2 index 2; Importowanie procedur z bibliotek Jeżeli już skompilujesz bibliotekę możesz ją wykorzystać w swoim programie. Oto sposób ( statyczny ) na zaimportowanie procedury z biblioteki. Na samym początku chciałem wspomnieć, że jest to statyczny sposób na załadowanie biblioteki. Najlepiej w sekcji Interface umieść taki nagłówek: procedure ShowWindow; stdcall external 'Example_lib.dll' name 'ShowWindow'; Załadowanie biblioteki następuje za pomocą słowa external - po tym nazwa biblioteki, a na samym końcu nazwa procedury do zaimportowania. Zauważ słowo stdcall pojawiające się teraz jak i w bibliotece DLL przy nazwie procedury. Zawsze stosuje tę dyrektywę gdyż zapewnia ona kompatybilność jeżeli np. biblioteka jest napisana w Delphi, a wykorzystujesz ją w C++. Istnieją także inne dyrektywy, które możesz wykorzystać przy swoich procedurach: safecall - Opatrując tą dyrektywą swoją procedurę masz pewność, że każdy zaistniały wyjątek zostanie przekazany do programu wykorzystującego daną bibliotekę. register - Ta dyrektywa począwszy od Delphi 2 jest dyrektywą domyślną gdyż zapewnia największą efektywność działania. Związane jest to z czyszczeniem stosu podczas działania procedury, ale nie zamierzam się tutaj rozpisywać o tej dyrektywie. pascal, cdecl Są to dwie konwencje - Pascalowa i C++. Rzadką są one wykorzystane gdyż mieszanką tych dwóch dyrektyw jest stdcall. Teraz gdy chcesz uruchomić procedurę ShowWindow wystarczy, że gdzieś w programie napiszesz: ShowWindow; Spowoduje to załadowanie z biblioteki DLL powyższej procedury. Gdy otworzysz projekt biblioteki DLL możesz w nim umieścić formularz. Wystarczy z menu File wybrać New Form. To nie wszystko musisz bowiem napisać procedurę, która tworzyć i wyświetlać będzie formularz. Oto cały kod biblioteki DLL: library LibSample; uses Forms, Main in 'Main.pas' {Form1}; procedure ShowForm; var Form1 : TForm1; begin Form1 := TForm1.Create(Application); // stworz formularz Form1.ShowModal; // wyswietl formularz Form1.Free; // zwolnij zmienna end; exports ShowForm index 1; begin end. Teraz gdy skompilujesz taką bibliotekę to będzie miała rozmiar zwykłego programu - w Delphi 2 jest to 175 KB. Cóż jest to niewątpliwie wada Delphi - generuje zbyt duże pliki wykonywalne oraz biblioteki DLL. Ok, teraz wyświetlenie formularza z biblioteki następuje za pomocą takiego kodu: procedure ShowForm; stdcall external 'LibSample.dll' index 1; // to w sekcji Interface No i gdzieś w programie wystarczy, że napiszesz: ShowForm; Proszę nie oceniać surowo jest to mój pierwszy artykuł. Pozdrawiam, ΜΦΞ Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Maximal Opublikowano 5 Czerwca 2008 Udostępnij Opublikowano 5 Czerwca 2008 http://4programmers.net/Delphi/Artyku%C5%82y/Biblioteki_DLL Widzę, że jakoś nie możesz sobie stąd pójść, więc Ci pomogę. Do widzenia. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Luksor Opublikowano 5 Czerwca 2008 Udostępnij Opublikowano 5 Czerwca 2008 Plagiator! A ja myślałem że ty tak fajnie napisałeś. Oj nie ładnie tak kopiować! :mellow: Proszę nie oceniać surowo jest to mój pierwszy artykuł. I jeszcze taki dopisek, byś się wstydził! :angry: Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
TuxMan Opublikowano 5 Czerwca 2008 Udostępnij Opublikowano 5 Czerwca 2008 Popieram Maximala. To po prostu artykuł żywcem skopiowany z 4programmers'a :P Ocena: 1/5 za umiejętność skopiowania artykułu ;) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
qspy Opublikowano 5 Czerwca 2008 Udostępnij Opublikowano 5 Czerwca 2008 Co to ma być? plagiator? bana mu! Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Luksor Opublikowano 5 Czerwca 2008 Udostępnij Opublikowano 5 Czerwca 2008 I nawet się nie wysilił aby skopiować cały artykuł! Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
lenin Opublikowano 5 Czerwca 2008 Udostępnij Opublikowano 5 Czerwca 2008 Maxius do domu!! mogłeś się wogóle postarać i napisać w jakim języku to jest bo nie widzę :huh: zal.ru E: już wiem, w temacie jest napisne... btw to Ziomalek ledwo robi jakieś śmieszne programy więc gdzie mu do pisania dll'i :huh: @Propa: Zbyt mądro? :] Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
propaganja Opublikowano 5 Czerwca 2008 Udostępnij Opublikowano 5 Czerwca 2008 heh wystarczy 1/3rzutu oka i widać że nie ziomas tonapisał Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Dawidds Opublikowano 5 Czerwca 2008 Udostępnij Opublikowano 5 Czerwca 2008 Jak tylko wszedłem w temat wiedziałem, że ot plagiat :D On pisze tandetne programy, co mu do pisania DLL'i. Założę się, ze nawet sam całego nie przeczytał ^^ Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Pieter Opublikowano 5 Czerwca 2008 Udostępnij Opublikowano 5 Czerwca 2008 Ctrl + C poszło w ruch!! RUCH RUCH HKS!! Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Driger Opublikowano 5 Czerwca 2008 Udostępnij Opublikowano 5 Czerwca 2008 Fajny art , szkoda tylko , ze nie Twoj :> Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Morrighan (AoM) Opublikowano 5 Czerwca 2008 Udostępnij Opublikowano 5 Czerwca 2008 Aż się zdziwiłem jak zobaczyłem, że autorem tematu jest Maxius, ale niestety po przeczytaniu Waszych postów zrobiło mi się go szkoda, nie dość, że podrabia program Luksora (robi jakiś notatnik) to jeszcze kopiuje cały wysiłek innego człowieka... Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Mucco Opublikowano 6 Czerwca 2008 Udostępnij Opublikowano 6 Czerwca 2008 Co to ma być? plagiator? bana mu! Pan też nie należy do tych najświętszych, prawda? <_< Czy jest pan administratorem serwisu www.darkwarez.pl czy tylko skopiował pan sobie avka i nicka? :D Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Kofel Opublikowano 6 Czerwca 2008 Udostępnij Opublikowano 6 Czerwca 2008 A skąd taka pewność że artykuł na 4programmers nie jest jego autorstwa? A jednak raczej nie. xD Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Grabus Opublikowano 7 Czerwca 2008 Udostępnij Opublikowano 7 Czerwca 2008 A pamiętacie podrobionego screena z gry Button Masher Jakluba? Też nas chciał oszukać :P Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się