Abfragen ob die Initialisierungs-Phase schon vorbei ist
-
Kennt jemand von euch einen Trick, mit dem man rausbekommen kann, ob die Initialisierungs-Phase schon vorbei ist?
Also die Phase in der statische und "extern" Instanzen initialisiert werden.Plattformunabhängig wird da es vermutlich nix geben, aber das ist auch völlig egal. Wenn es mit MSVC 2005, bei Verwendung der DLL-Runtime geht, reicht mir das vollkommen.
Ich würde mir nämlich sehr gerne eine
AssertInitializationPhaseComplete()Funktion basteln. Fände ich gut, da es viel zu leicht ist, zu übersehen, dass man eine Klasse nicht in dieser Phase initialisieren darf. (Gründe dafür gibt's ja leider viele, z.B. wenn DLLs geladen werden etc.)p.S.: genauso wäre interessant die Deinitialisierungs-Phase abfragen zu können. Wenn das ganze dann noch für DLLs funktioniert, wäre meine Verzückung komplett

-
Wenn main/WinMain erreicht ist, ist auch die Initialisierung vollständig.
Gleiches gilt für DllMain.Sag mal etwas genauer warum Du diese Info brauchst.
Grundsätzlich: Schau Die den CRT Sourcecode an, der ist ziemlich simpel.
Der Linker setzt den eigentlichen Einsprungpunkt in die CRT, was dann hinterher DllMain/main/WinMain ist, das ist dann Code, dernach dem CRT Init abläuft.
Dito ist das lette was die CRT macht atexit. Auch der exit Code ist simpel.
-
Ich müsste an die Info kommen, ohne dass ich die main()/DllMain() modifiziere.
Wofür ich es brauche hab' ich ja schon geschrieben: für ASSERTs.
Beispiel: wir haben eine DllLoader Hilfs-Klasse. Die natürlich im ctor LoadLibrary aufruft.
Nun verwenden die leidergottes aber viele so, dass sie statisch ne Instanz davon anlegen:// B.DLL Code: A::DllLoader g_cDll("c.dll"); // <- BÖSE __declspec(dllexport) void Test() { g_cDll.SomeFunction(); }Ein
ASSERT(!InInitializationPhase())inA::DllLoader::DllLoaderwürde hier Wunder wirken.
Das Dumme ist nämlich, dass sowas wie da oben oft genug einfach "trotzdem" geht. Deswegen übersieht man es eben. Bis man dann irgendwann eine Änderung an einer ganz anderen DLL macht, und auf einmal fliegt einem alles um die Ohren.So einen Fall hatten wir schon.