Programowanie w języku C/C++ » FAQ

Korzystanie z DLL

  • 2008-07-28 11:04
  • 11 komentarzy
  • 5108 odsłon
  • Oceń ten tekst jako pierwszy
Witam. To mój pierwszy artykuł, więc proszę o wyrozumiałość jeśli popełnię błąd :)

Przejdźmy do rzeczy.
DLL (z ang. Dynamic-Link Library - biblioteka łączona dynamicznie) - w środowisku Windows biblioteka współdzielona (z ang. shared library), która przechowuje implementacje różnych funkcji (podprogramów) programu i/lub zasoby programu. Biblioteka DLL sama nie może wywoływać swoich funkcji (wykorzystywać zasobów w niej zawartych), może to zrobić jedynie program EXE.  
                                                                                                          Źródło: www.wikipedia.pl

W tym artykule nauczymy się tworzyć i wykorzystywać funkcję z plików dll.

                                      <center>   Aplikacja</center>

Na początek stworzymy naszą aplikację konsolową (File->New->Other... wybieramy Console Wizard).
Gdy już to zrobimy dołączmy do projektu bibliotekę iostream, żeby to zrobić wpisujemy taki kod:
#include <iostream.h>

koło innych takich podobnych kodów (:PP)
Teraz narzuca się pytanie: dlaczego dołączyć to bibliotekę? Ano dlatego, że bez tej biblioteki nie moglibyśmy używać takich funkcji jak cout czy cin, dzięki którym możemy wypisywać i odczytywać tekst z konsoli. Gdy dołączyliśmy już tą bibliotekę dołączamy dwie kolejne:
#include <conio.h>
#include <stdlib.h>

Pierwsza jest po to aby móc użyć funkcji getch() o której powiem później, natomiast druga jest aby zastosować funkcję system("PAUSE") o której też powiem później.
Nad lub pod wszystkimi includami wlepiamy taki kod:
#pragma comment(lib, "NazwaDLL'a.lib")    //Nie jestem pewien ale chyba jakoś dołącza plik //*.lib do 
                                                               //programu.
                                                    
NAD sekcją main piszemy to:
std::string funkcja; //Deklarujemy zmienną typu string o nazwie funkcja.
__declspec(dllimport)void dobrze(void);  //Kod dla nas kluczowy, importuje z pliku dll funkcję dobrze i
__declspec(dllimport)void zle(void);      //zle.

Następnie w sekcji main taki kod:
cout << "Witaj. Napisz funkcja.\n"; //Program wyświetli: Witaj. Napisz funkcja.
std::cin >> funkcja;                      //Zapisujemy to co napisał użytkownik do wcześniej zdeklarowanej 
                                                   //zmiennej funkcja.
if (funkcja=="funkcja") dobrze(); //Sprawdzamy czy to co napisał użytkownik jest równe <i>funkcja</i>
                                                   //Jeśli tak wykonuje wcześniej zaimportowaną funkcję przykład.
else {                                          //W przeciwnym razie...
 zle();                                         //Program wyświetli: Pacanie, zle!
system("PAUSE");                      //I zatrzyma wykonywanie programu
 } 
                    .


To na razie byłoby na tyle... Nawet nie próbujcie testować bo i tak nie zadziała ponieważ nie znajdzie pliku .dll i .lib Musimy je stworzyć :)

                                                      <center> Plik DLL</center>

Aby stworzyć plik dll w C++ Builder wybieramy File->New->Other... i wybieramy DLL Wizard. Widzimy tam dłuuugi komentarz, który można usunąć :)
OK, jako iż ja zaprezentuję przykład wykorzystania biblioteki dll w aplikacji konsolowej dołączamy do naszego projektu bibliotekę iostream, jak to zrobić napisałem wcześniej.
Następnie POD sekcją main wklejamy taki kod:
__declspec(dllexport)void dobrze(void) {     //Tworzy i eksportuje funkcję dobrze
cout << "Prawidlowo\n";
}
__declspec(dllexport)void zle(void){         //i zle...
cout << "Pacanie, zle!\n";
}
getch();        //Dzięki tej funkcji okno nie zamyka się zaraz po otwarciu. 
return 0;



To już wszystko :)

Gdyby ktoś miał trudności tu są całe listingi:

Aplikacja:
#include <vcl.h>
#include <iostream.h>
#include <conio.h>
#pragma hdrstop
#pragma comment(lib, "Project1.lib")
#pragma argsused
__declspec(dllimport)void dobrze(void);
__declspec(dllimport)void zle(void);
std::string funkcja;
int main(int argc, char* argv[])
{
cout << "Witaj. Napisz funkcja.\n";
std::cin >> funkcja;
if (funkcja>="funkcja") dobrze();
else {
zle();
system("PAUSE");
}
        getch();
        return 0;
}



I plik...
#include <vcl.h>
#include <windows.h>
#include <iostream.h>
#pragma hdrstop
#pragma argsused
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
        return 1;
}
 
__declspec(dllexport)void dobrze(void) {
cout << "Prawidlowo\n";
}
__declspec(dllexport)void zle(void) {
cout << "Pacanie, zle!\n";
}


Zapamiętajcie, że aby aplikacja działała musi być w tym samym katalogu co pliki .lib i .dll!

Pozdrawiam :)

11 komentarzy

Dynax 2008-07-31 10:28

Ale tylko w tym BCB (bleee...). Ten "artykuł" jest po prostu beznadziejny.

wargo 2008-07-29 16:50

Ale artykuł także opisuje jak program może pobrac dane z dll-podstawy i przykład, i ten przykład działa!

manfredek 2008-07-29 13:58

Crayze : coś mi się wydaje że #pragma comment(lib, "foo.lib") to wynalazek MS a nie Borlanda...

m_laszkiewicz 2008-07-28 21:21

zachęcam to takiej filozofii drodzy koledzy, że jak już coś robić to albo dobrze albo wcale...Ten artykuł niestety jest beznadziejny. Może dla kogoś kto nie wie co to DLL...ale od tego jest MSDN i Wikipedia...A na merginesie. To nAwet podstawy z podstaw nie są...

crayze 2008-07-26 10:30

michak jak na początkującego ładny artykuł, oby tak dalej...
Niemniej jednak nie wszystko napisałeś jak należy...
po 1 - ciut inaczej konstruuje się cały układ, np. napisałeś "NAD sekcją main piszemy to:" importy to akurat wypada wrzucić do pliku nagłówkowego biblioteki...
po 2 - BCB ma wielu przyciwników(chyba więcej niż zwolenników), dlatego wypada pokazać również dołączenie biblioteki statycznej w innych środowiskach, bo akurat "#pragma comment(lib, "NazwaDLL'a.lib")" to wynalazek tylko i wyłączenie borlandu, a innych to nie będzie działać
po 3 - nic nie napisałeś o łaczeniu dynamicznym, a to chyba nawet ważniejsze niż łączenie statyczne, przynajmniej na pewno sprawi więcej problemów początkującym
po 4 - warto także wspomnieć o importowaniu klas z bibliotek DLL, bo to nie może umknąć przy C++
pewnie jeszcze parę niedociągnięć by się znalazło :>

ogólnie rzecz biorąc, artykuł jest do rzeczy, ale to tylko zaledwie zalążek, same podstawy DLL, i to tylko w Borlandzie <ble> Zmień tytuł na: "podstawy korzystania z DLL w BCB", bo na "korzystanie z DLL" to jeszcze za mało według mnie...

manfredek 2008-07-25 20:04

Znam, przecież używam Code::Blocks (g++) a czasem Visuala, ale nikt nie zabrania się czepiać

Dynax 2008-07-25 09:46

A co? Nie znasz innego IDE niż (ten głupi) BCB?

manfredek 2008-07-24 16:09

Milutkie te zdeprecjonowane nagłówki, nie?? Poza tym jak zrobić projekt DLLa jak się nie ma BCB??

michak 2008-07-24 11:25

Może i można inaczej, ale tak też działa :)

Dynax 2008-07-24 10:43

To nie tak! Z DLL korzysta się inaczej.

Potwoor_ 2008-07-23 23:54

temat taki jakiś nie tak mi się wydaje

a jeśli się nie mylę to gdy nie podaje się pełnej ścieżki do biblioteki to jest ona wyszukiwana w katalogu programu, głównym katalogu systemu i chyba w katalogach system i system32 ( tylko windows ) =]