dll i plik exe

  • Rejestracja: dni
  • Ostatnio: dni
0

Cześć,
Mój program działa jako jako aplikacja exe dla windows (mfc) i korzysta z jednej zewnętznej bibioteki dll.

Aktualnie mam załadowaną bibliotekę jako resource i podczas uruchamiania programu mogę ją odczytać z pamięci i zapisać w miejscu gdzie jest moja aplikacja exe. ale problem jest, gdyż moja aplikacja ma korzystać z tego dll, a więc najpierw woła że nie ma dll, co nie ma sensu.

Jak opóźnić ładowanie dll do określonego momentu żebym mógł wczytać z pamięci dll który ma zostać wczytany i zapisać go na dysku ?

Azarien
  • Rejestracja: dni
  • Ostatnio: dni
1

Ładowac ją dynamicznie:
0. wywal libkę importową z opcji linkera

  1. LoadLibrary (tu zamiast tego twój wynalazek z resource'em...)
  2. GetProcAddress dla każdej funkcji z DLL-ki.
KA
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Gorlice
0

Widocznie masz gdzieś w tablicy importów pliku odniesienia do funkcji zawartych w tej DLL. Musisz używać funkcji zawartych w DLL dynamicznie a więc gdy już biblioteka będzie "wypakowana" robisz LoadLibrary, gdy chcesz wywołać funkcje musisz zdobyć jej adres a wiec GetProcAddress a gdy przestanie być potrzebna FreeLibrary.
EDIT//spóźniłem się

  • Rejestracja: dni
  • Ostatnio: dni
0
Azarien napisał(a):

Ładowac ją dynamicznie:
0. wywal libkę importową z opcji linkera

  1. LoadLibrary (tu zamiast tego twój wynalazek z resource'em...)
  2. GetProcAddress dla każdej funkcji z DLL-ki.
kAzek napisał(a):

Widocznie masz gdzieś w tablicy importów pliku odniesienia do funkcji zawartych w tej DLL. Musisz używać funkcji zawartych w DLL dynamicznie a więc gdy już biblioteka będzie "wypakowana" robisz LoadLibrary, gdy chcesz wywołać funkcje musisz zdobyć jej adres a wiec GetProcAddress a gdy przestanie być potrzebna FreeLibrary.
EDIT//spóźniłem się

Dzięki za pomoc, ale gdy usunąłem .lib z projektu i wykonałem rebuild, to wywaliło mi następujący błąd:
<quote>Error 14 error LNK2019: unresolved external symbol __imp__FT_W32_PurgeComm@8 referenced in function "public: int __thiscall Jen::WriteBuf(char *,int)" (?WriteBuf@Jen@@QAEHPADH@Z) C:\Users\admin\Mil\Jen.obj Jen<//quote>

Jen.cpp korzysta z .lib którego właśnie wywaliłem.

Wyrzuciło mi kilknaście takich błędów tego typu.

Dlaczego ?

KA
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Gorlice
0

Bo to nie masz usunąć liba który statycznie ładował DLL i importował z niej funkcje i być zadowolony tylko przerobić resztę kodu wg. naszych wskazań.

  • Rejestracja: dni
  • Ostatnio: dni
0
kAzek napisał(a):

Bo to nie masz usunąć liba który statycznie ładował DLL i importował z niej funkcje i być zadowolony tylko przerobić resztę kodu wg. naszych wskazań.

Zrobiłem tak jak napisaliście.

Przykładowo:

Kopiuj
	HMODULE hModule = LoadLibrary("bine1.dll");

	GetProcAddress(hModule, "MP_EYI");
	GetProcAddress(hModule, "MP_EYI2");

Chciałem pozbyć sie dla testu chociaż 1 errora z listy, w funkcji z errorem występowały te wywołania, a wiec je dodałem i nic z tego. Dalej pojawia się error dotyczący funkcji w której sa te wywołania...

.lib wywaliłem z properties projektu

Coś chyba źle pojmuje to, proszę o wytłumaczenie jak dla osiołka ;)

Dzięki za pomoc!!

06
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2440
0

Jak opóźnić ładowanie dll (...)

Dodaj bibliotekę do listy bibliotek, które mają być ładowane z opóźnieniem. Jeśli korzystasz z Visuala, tu masz opis opcji: http://msdn.microsoft.com/en-us/library/yx9zd12s.aspx

RE
  • Rejestracja: dni
  • Ostatnio: dni
0

Obawiam się, że z delay loadingiem może być za dużo zachodu. Na pewno fajne jest to, że będziemy mieli te wpisy w IAT (brak miliona typedefów, GetProcAddress), ale z domyślnym "helper function" trzeba będzie wstawić tę rozpakowaną dllkę do katalogu z aplikacją. Możemy to obejść pisząc własny handler, ale wtedy wyjdzie chyba więcej kodu niż podejście, które zostało już w tym wątku omówione.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.