2016-08-12 2 views
1

Das Projekt in eine DLL kompiliert wird, um in ein ausführbares injiziert werdenVerzögerung der Aufbau eines statischen Elementobjekt

Das Projekt auf eine API stützt, die ganz am Anfang in main() wie so initialisiert wird:

int DLL_main() 
{ 
    TheApi::Initialize(); 
    AnObject anObjectInstance; 
    //.. 
} 

Es ist ein Objekt, das mit einer Klassendefinition ähnlich wie diese aufgebaut ist:

class AnObject() 
{ 
    AnObject(); 
    ~AnObject(); 

    static ApiHelper apiHelperObject; //This object assists in making certain api features easier to use 
} 

//Inside AnObject.cpp 

ApiHelper AnObject::apiHelperObject; 

im Konstruktor von apiHelperObject, gibt es einige API-Funktion aufruft

Nach Injektion der dll, passiert nichts (keine Fehlermeldung auch) aber , wenn das statische Schlüsselwort aus apiHelperObject entfernt wird alles funktioniert gut

Das Problem scheint zu sein, dass das statische Element ist wobei konstruiert vor die API

initialisiert Es ist nicht möglich TheApi::Initialize() in apiHelperObject ‚s Konstruktor zu nennen, weil es mehrere verschiedene api Hilfsobjekte sind, und das würde TheApi::Initialize() dazu führen, mehr als einmal aufgerufen werden

Und so ist die Frage:

Was ist der beste Weg, um die api vor dem statischen Member-Objekt der Initialisierung aufgebaut ist? Oder, was ist der beste Weg, um die Konstruktion des statischen Elements zu verzögern?

Vorzugsweise wird ein Zeiger nicht verwendet, da die Syntax nicht besonders

begünstigt

Danke

+0

_ "Das Problem scheint zu sein, dass das statische Element erstellt wird, bevor die API initialisiert wird" _ Warum sollte es nicht sein? Es ist Namespace-statisch. Es wird initialisiert, bevor etwas anderes passiert. Beenden Sie die Verwendung von Initialisierungsfunktionen und verwenden Sie Konstruktoren ordnungsgemäß. –

+0

Entschuldigung für den Typ-o, es war nicht beabsichtigt, eine Funktion Erklärung, bearbeitet werden. Die API gehört mir nicht, die Initialisierungsfunktion muss aufgerufen werden – linko13

Antwort

5

In gewöhnlichen Standard-C++ Sie immer die Initialisierung eines static Objekt verzögern kann es lokal zu einer Zugriffsfunktion, indem sie .

im Wesentlichen, dass ein Singleton Meyers:

auto helper_object() 
    -> ApiHelper& 
{ 
    static ApiHelper the_object; 
    return the_object; 
} 

Hier, in Standard-C++, wird das Objekt zum ersten Mal der Ausführung initialisiert die Erklärung durchläuft.

Aber der C++ - Standard unterstützt dynamische Bibliotheken nicht aktiv, geschweige denn DLL-Injektion. Es ist schwer zu sagen, wie das ausgehen wird. Vorsicht vor Threading-Problemen.

Verwandte Themen