[BCB2007] EXE i DLL ładują tą samą DLL

0

Witam,

sytuacja jest taka: EXE i DLL ładują tą samą DLL_X. Przy kończeniu programu dostaję AV.

EXE, DLL i DLL_X skompilowane są z zaznaczonymi:

  • Dynamic RTL,
  • Build with runtime packages,

W SDK napisali dla LoadLibrary:

If lpFileName does not include a path and there is more than one loaded module with the same base name and extension, the function returns a handle to the module that was loaded first.

Czyli, że dla EXE i DLL pomimo wywołania LoadLibrary 2x mam 1 uchwyt do DLL_X, no nie? Sprawdzałem i faktycznie uchwyty są takie same. Więc zwalniam DLL_X tylko raz, w programie. I dlaczego ten AV dalej jest?

0

Bo to nie wina zwalniania? System zlicza referencje do plików dll - tyle razy ile został załadowany tyle razy musi zostać zwolniony aby fizycznie zostać z pamięci usuniętym. Weź człowieku debugger i zobacz co faktycznie się sypie.

0

Ładuję DLL_X 2 razy. I niezależnie czy zwalniam 1x czy 2x wyskakuje:

Project color2.exe raised exception class EAccessViolation with message 'Access Violation'.

AV wyskakuje po zwolnieniu DLL_X z DLL, DLL z EXE, DLL_X z EXE. Wyświetlam sobie komunikaty po każdym zwolnieniu.

0

To nie wyświetlaj komunikatów tylko prześledź debuggerem, instrukcja po instrukcji. Na moje oko reakcja na DLL_PROCESS_DETACH w tej dll'ce jest spaprana jeżeli to nie wina Twojego programu.

0

daj nagłówki funkcji eksportowanych z tego dlla

0

W DLL_PROCESS_DETACH w DLL_X wyświetlam tylko komunikat. A w DLL w ogóle nie ma nic w DLL_PROCESS_DETACH.

0
Misiekd napisał(a)

daj nagłówki funkcji eksportowanych z tego dlla

W DLL_X eksportuje tylko 1 funkcję:

extern "C" {
	__declspec( dllexport )void CALLBACK ZaladujJezyk(int xiLNG, TForm * xfrmForma, char * xcptrSekcja, char * xcptrIni);
}
0

ShareMem jest?

0

No nie ma. Ale to jest chyba potrzebne gdy nie ma Dynamic RTL zaznaczonego, prawda?

Wywala się - patrząc linia po linii, w pliku xlocale w linii 1277:

_PROTECTED:
	virtual ~ctype()
		{	// destroy the object
		_Tidy();
		}//TU
0

e? cos Ci CRT deinicjalizuje dwa lub wiecej razy na zakonczeniu procesu..? bo tak to wyglada..
masz crt wlinkowane statycznie w dllke czy jak?

0

Hesus, CRT? C run-time library? Nie mam pojęcia. A jak powinno być, lub co powinienem popróbować.


Hmm, skopiowałem DLL_X i z DLL uruchamiam DLL_X2, a z EXE DLL_X. I AV jest dalej. Wychodzi na to, że problemem jest ładowanie biblioteki w bibliotece. Są jakieś szczególne warunki do spełnienia?

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