2010-12-21 12 views

Odpowiedz

20

MSDN za DllMain mówi:

Jeśli DLL jest związane z C biblioteki run-time (CRT), wejścia punktu za pomocą CRT wywołuje konstruktorów i destruktorów dla globalny i statyczne obiekty C++. Dlatego te ograniczenia dla DllMain mają również zastosowanie do konstruktorów i destruktorów i dowolnego kodu, który jest z nich wywoływany .

Ponieważ kod wewnątrz DllMain może wykorzystywać obiekty statyczne, statyczne obiekty muszą być zbudowane przed DllMain jest prowadzony za DLL_PROCESS_ATTACH i zniszczone po jego uruchomieniu na DLL_PROCESS_DETACH.

Możesz to sprawdzić za pomocą prostego pliku testowego exe i biblioteki testowej.

EXE:

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    wprintf(L"Main, loading library\n"); 
    HMODULE h = LoadLibrary(L"Test.dll"); 

    if (h) 
    { 
     wprintf(L"Main, freeing library\n"); 
     FreeLibrary(h); 
    } 

    wprintf(L"Main, exiting\n"); 
    return 0; 
} 

DLL:

struct Moo 
{ 
    Moo() { wprintf(L"Moo, constructor\n"); } 
    ~Moo() { wprintf(L"Moo, destructor\n"); } 
}; 

Moo m; 

BOOL APIENTRY DllMain(HMODULE hModule, 
         DWORD ul_reason_for_call, 
         LPVOID lpReserved) 
{ 
    switch (ul_reason_for_call) 
    { 
    case DLL_PROCESS_ATTACH: 
     wprintf(L"DllMain, DLL_PROCESS_ATTACH\n"); 
     break; 
    case DLL_THREAD_ATTACH: 
     wprintf(L"DllMain, DLL_THREAD_ATTACH\n"); 
     break; 
    case DLL_THREAD_DETACH: 
     wprintf(L"DllMain, DLL_THREAD_DETACH\n"); 
     break; 
    case DLL_PROCESS_DETACH: 
     wprintf(L"DllMain, DLL_PROCESS_DETACH\n"); 
     break; 
    default: 
     wprintf(L"DllMain, ????\n"); 
     break; 
    } 
    return TRUE; 
} 

Razem te będą drukowane:

Main, loading library 
Moo, constructor 
DllMain, DLL_PROCESS_ATTACH 
Main, freeing library 
DllMain, DLL_PROCESS_DETACH 
Moo, destructor 
Main, exiting 

Jak widać, obiekt statyczny jest zbudowany przed DllMain(...,DLL_PROCESS_ATTACH,...) i zniszczone po DllMain(...,DLL_PROCESS_DETACH,...)