Windows DLL uploader uventet mere end én gang i samme applikation

Indlæg af Hanne Mølgaard Plasc

Problem



Et program jeg skrev (i C #) får adgang via et C ++/CLI wrapper bibliotek et indbygget (c ++) bibliotek jeg også skrev.


Jeg har bemærket, at den indbyggede bibliotekets DllMain-metode kaldes mere end én gang, og debuggeren mener, at flere hukommelsessteder er forbundet til nogle af bibliotekets opkald. Fra det jeg ser, initialiseres biblioteket (og hukommelsen tildelt) mere end en gang .


Da min kode ikke bruger funktioner som LoadLibrary, og dll bruges, herunder bibliotekets .h-filer og .lib, hvorfor initialiseres det mere end en gang, og hvad kan jeg gøre for at undgå det?

Bedste reference


AFAIK DLL må ikke indlæses mere end én gang i samme adresserum. Selvom du kalder LoadLibrary eksplicit, vil DLL'en ikke blive indlæst mere end én gang, men dens reference tæller i stedet for.


Også jeg forstår ikke præcis hvad du mener med ' debugger mener, at flere hukommelsessteder er forbundet til nogle af bibliotekets opkald '. Et enkelt importeret symbol (funktion eller en variabel adresse) er fyldt af bare en adresse under DLL-binding.


Jeg tror, ​​du har et af følgende:



  • Du kan muligvis indlæse flere versioner af samme bibliotek (flere DLL-filer) samtidigt. En typisk fejl er at indlæse fejlfinding og frigive DLL-versioner samtidigt.

  • Din DllMain hedder flere gange, men det betyder ikke, at den er ilagt flere gange. Kontroller du parametrene, der leveres til DllMain? Er det DLL\_PROCESS\_ATTACH eller måske det er bare DLL\_THREAD\_ATTACH/DLL\_THREAD\_DETACH?


Andre referencer 1


En DLLs indgangspunkt kaldes, når den først indlæses i processen, samt når en tråd i processen startes eller stoppes.


Hvis dette forårsager problemer i din DLLMain, skal du kontrollere årsagen til DLL-indtastning og håndtere passende. [6]