dll - wykorzystanie w programie C++

0

Dzień dobry.
Mam bibliotekę dll od klienta (realizuje jakieś operacje na bazie Oracle). Chciałbym wykorzystać ją w programie C++ (konsolowym) w celu przetestowania rozwiązania. W jaki sposób wywołać funkcje z tej biblioteki - mam ich deklaracje (ich opis - parametry i zwracane wartości).
Czy sama dll-ka wystarczy, czy powinienem mieć coś jeszcze? Korzystam z Visual Studio (jeśli ma to znaczenie).
Wdzięczny będę za przykłady jak wykorzystywać w programie zewnętrzne biblioteki dll.

0

Na linuxie masz dlopen, załadowanie i dlsym, zwracające wskaźnik funkcji.
Na windowsie LoadLibrary załadowanie i GetProcAddress.

http://stackoverflow.com/questions/8696653/dynamically-load-a-function-from-a-dll
https://linux.die.net/man/3/dlopen

3

Czy sama dll-ka wystarczy, czy powinienem mieć coś jeszcze? Korzystam z Visual Studio (jeśli ma to znaczenie)

Są dwa sposoby ładowania DLL-ki pod Windows:

  1. automatyczny (zwany „statycznym”). Bibliotekę ładuje system podczas uruchamiania EXE. Funkcje wykonujemy bezpośrednio (a przynajmniej tak się nam wydaje), tzn. funkcje są deklarowane jako funkcje:
void foo_w_dllce();

i linker sobie znajdzie je w DLL-ce. Ale żeby znalazł, potrzebna jest dodatkowa biblioteka importowa (.lib) podawana linkerowi. Biblioteka taka zawiera tylko informację, że właściwe funkcje są w DLL-ce.

Jeżeli podczas uruchamiania EXE będzie brakować DLL-ki, albo w DLL-ce będzie brakować używanej funkcji, program się nie uruchomi.
Biblioteki załadowanej w ten sposób nie można wyładować.

  1. ręczny (zwany „dynamicznym”). Bibliotekę ładujemy w kodzie, za pomocą LoadLibrary, a następnie pobieramy wskaźniki na funkcje za pomocą GetProcAddress podając nazwę danej funkcji jako stringa.
    Funkcje są dla nas zmiennymi (wskaźnikami na funkcje):
void (*foo_w_dllce)();

HMODULE dllka = LoadLibrary("dllka.dll");
foo_w_dllce = (void(*)())GetProcAddress("foo_w_dllce");
foo_w_dllce();
FreeLibrary(dllka);

Nie trzeba żadnych dodatkowych plików .lib dla linkera.
Jeżeli brakuje DLL-ki, LoadLibrary zwróci NULL.
Jeżeli w DLL-ce brakuje funkcji, GetProcAddress zwróci NULL.
Bibliotekę możemy w każdej chwili załadować i wyładować.

1 użytkowników online, w tym zalogowanych: 0, gości: 1