c + + - Indlæs en DLL mere end en gang?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg bruger funktionen LoadLibrary til at indlæse en DLL i Windows. Mit spørgsmål er dette: Hvis jeg kalder denne metode mere end én gang for den samme DLL, får jeg håndtag til forskellige forekomster af DLL'en, eller vil de alle henviser til samme instans? [13]


Desuden, hvordan svarer denne adfærd til Linux SO-filer, er den den samme eller helt anderledes, og hvilke antagelser kan jeg gøre i denne henseende? Tak.

Bedste reference


MSDN-dokumentationen hedder:



  Systemet opretholder et referencetal pr. Proces på alle indlæste
  moduler. Opkald LoadLibrary øger referencetællingen. Ringer
  FreeLibrary eller FreeLibraryAndExitThread funktionen reducerer
  referenceantal. Systemet aflæser et modul, når dets referencetælling
  når nul eller når processen afsluttes (uanset
  referenceantal).



Så det ser ud til, at indlæsning af modulet mere end én gang (uden matchende opkald til FreeLibrary) vil returnere det samme håndtag.

Andre referencer 1


Hvis DLL'en allerede er indlæst, vil LoadLibrary simpelthen returnere bibliotekets adresse i hukommelsen. Men DllMain kaldes ikke igen med DLL\_PROCESS\_ATTACH, når den anden belastning er forsøgt. Håndtag i bibliotekernes forstand er bare hukommelsessteder, så den værdi, du får anden gang, skal være den samme som den første.


Hvad linux SO-filer går, ser jeg ikke hvorfor de ville indlæse to gange enten. Men en anden bliver nødt til at veje ind på dette for at give dig et ordentligt svar.

Andre referencer 2


For Linux-delte objekter, fra dlopen(3) manpage: [14]



  Hvis det samme bibliotek er indlæst igen med dlopen(), den samme fil
  håndtaget er returneret
. Biblioteket dl opretholder referencetællinger for
  bibliotek håndtag, så et dynamisk bibliotek er ikke afsat til
  dlclose() er blevet kaldt på det så mange gange som dlopen() har
  lykkedes det
. \_init() rutinen, hvis den foreligger, kaldes kun en gang .
  Men et efterfølgende opkald med RTLD\_NOW kan tvinge symbolopløsning for a
  bibliotek tidligere indlæst med RTLD\_LAZY.