dll i plik exe

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 ?

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.
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ę

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 ?

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ń.

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:

	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!!

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

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.

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