[pr] import/eksport zmiennej z DLL

0

Witam!
Piszę program, który głównie będzie się składał z wtyczek.
Napotkałem dosyć dziwną (w moim mniemaniu) sytuację.
Otóż tworząc bibliotekę DLL udało mi się (teoretycznie) wyeksportować zmienną. Jest to dla mnie co najmniej dziwne, bo nie mam zielonego pojęcia jak taką zmienną można by użyć. Oto jak to wygląda:

plik test.h

extern "C" __declspec(dllexport) int Version();  //eksport funkcji
extern "C" __declspec(dllexport) int zmienna;    //eksport zmiennej

plik test.cpp

int zmienna;  //deklaracja zmiennej
int Version()  //funkcja
{return 1;}

Dynamiczne ładowanie funkcji wygląda teraz tak:
plik *.h

typedef int (WINAPI *VerFunc)();

plik *.cpp

VerFunc VerFunkcja;
HINSTANCE biblioteka;

biblioteka = LoadLibrary("test.dll");
VerFunkcja = (VerFunc )GetProcAddress(biblioteka,"_Version");

I to działa dobrze, ale teraz w jaki sposób miałbym uzyskać dostęp do tej zmiennej zmienna. Czy też mam użyć funkcji GetProcAddress?? A jeśli tak, to jakiego typu byłaby ta zmienna (odpowiednik VerFunc).

Będę wdzięczny za wszelkie przemyślane odpowiedzi.
I nie piszcie, że mogę mieć dostęp do tej zmiennej eksportując odpowiednią funkcję, przez którą będę odczytywał lub modyfikował tę zmienną - tak umiem. Ciekawi mnie właśnie ten opisany sposób.

0

Czym jest funkcja? Funkcja to adres w pamięci, gdzie zaczyna się jej wykonanie.
Co to zmienna? To adres w pamięci, gdzie znajduje się jakaś wartość.
Co otrzymujesz przez załadowanie funkcji z dll? Otrzymujesz jej adres.
Co otrzymujesz przez załadowanie zmiennej z dll? Otrzymujesz adres miejsca w pamięci, gdzie jest przechowywana jakaś wartość (wartość tej zmiennej).
Po co jest rzutowanie? Aby powiedzieć kompilatorowi jak rozumieć jakiego typu jest ta funkcja/zmienna.
Myślę, że powinno to wyglądać tak:
biblioteka = LoadLibrary("test.dll");
wsk_zmienna = (int *)GetProcAddress(biblioteka,"zmienna");

Oczywiście to tylko moje przypuszczenia.

0

Do projektu jak sie doda pliki *.h DLL'a i się załaduje bibliotekę to chba nie trzba używać żadnych GetProcesAdress wystarczy odwolas sie jakby była to normalna zmienna.

Jednak tak. Dołacz do projektu plik *.h którego używa twój dll i w projekcie napisz gdzies

#pragma comment(lib,"NazwaBiblioteki.lib")

i teraz np po prostu wywołaj funkcje np.

GetCurrientTime();

0

BolekiLol - dzięki za poświęcony czas, ale nie przeczytałeś uważnie tego, co napisałem. Następnym razem upewnij się, że rozumiesz temat na który odpowiadasz.

[<font color="blue">dopisane</span>]
OK - wszystko działa bez zarzutu.
Thnx Dryo [soczek].

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