c ++ - dll adgangspunkt spørgsmål/rådgivning er nødvendig

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har et dynamisk bibliotek af c + + kode, der er cross platform og for det meste bare native c ++. Jeg bruger derefter dette dynamiske bibliotek fra min hovedeksempel. Hidtil har alle været gode på OSX ved hjælp af gcc. Nu er jeg på Windows, jeg er forvirret med, hvilken metode jeg skal bruge til at komme ind i DLL'en. Jeg har ikke en DllMain-funktion i øjeblikket, da dette ikke var nødvendigt i Gcc (efter min viden). på inspektion afslørede, at mærkeligt en af ​​mine klassekonstruktører blev kaldt på dll-belastning, så jeg regnede med at jeg skulle gøre noget mere på windows. Så gør jeg:



  • Tilføj en DllMain-funktion?

  • Er jeg sikker på at bare bruge noentry compiler-indstillingen?



Når jeg gør en af ​​ovenstående, begynder jeg at få kompilatorklager i vejen af ​​'.CRT-sektionen eksisterer, kan der være uhåndterede statiske initialiseringsmuligheder eller terminatorer'


Jeg har læst på dette ved hjælp af denne artikel, men noget råd og klarhed om den bedste vej frem ville blive meget værdsat. Det er lidt sløret i mit hoved, hvad jeg skal gøre. [5]

Bedste reference


Baseret på .CRT fejlen har du helt sikkert brug for en DllMain-funktion. For de fleste Windows-kompilatorer vil en DllMain automatisk blive leveret til dig, så du ikke behøver at skrive en selv. På baggrund af andre dele af dit spørgsmål forekommer det højst sandsynligt, at du bruger Visual C ++, hvis CRT giver en DllMain for dig. Så mens du har brug for en DllMain, behøver du ikke at skrive koden til den.


Standard VC CRT DllMain bruges til at initialisere CRT for den pågældende DLL og at initialisere alle de statiske/globale variabler, som dll'en giver.


Modellen til DLL'er på Unix og Windows er væsentligt anderledes, og du bør tænke på hver DLL som at have et mere 'privat' sæt state. Selv om alle Dll'er vælger den samme version af CRT dll'en, vil en del af den pågældende del blive delt.


Fordi CRT giver en DllMain til dig, bør du ikke kaste/noentry på linkeren.


.CRT sektionen eksisterer fejl (som du skal have set ved at kaste/noentry) fortæller dig, at du har brug for en DllMain, fordi du har en eller flere objekter i din DLL, der kræver statisk initialisering.


Martyn

Andre referencer 1


Hvis det kun er et bibliotek, skal NOENTRY være tilstrækkeligt. DllMain er der for at styre begivenheder, der sker med DLL'en (dvs. vedhæft, løsne osv.).

Andre referencer 2


Du kan ændre koden (lidt) for at undgå alle indgangspunkter, men hovedmenuen. I det væsentlige, hvis du har en variabel defineret uden for funktionerne (globalt men ikke statisk forbundet), skal du sætte dem i et funktionsopkald. Brug de ofte glemte statiske funktionsvariabler.
Dvs. ændre global erklæring


SomeType var\_name;


Til dette:


SomeType & var\_name(){static SomeType var; return var;}


På samme måde kan du ændre statiske klasse-forekomstvariabler ved at ændre dette:


struct Container{
    Container();
    static Container instance;
};

Container Container::instance;


Til dette:


struct Container{
    Container();
    static Container & instance();
};

Container & Container::instance(){
    static Container var;
    return var;
}


Dette er i det væsentlige en singleton, men der kan være nogle samtidighedsproblemer, hvis den første gang du får adgang til eksemplet, kommer fra et multi-threaded-miljø. Faktisk er det at huske på, at i modsætning til globalt definerede variabler, vil statisk lokalt definerede variabler initialiseres første gang funktionen kaldes.