2010-12-21 19 views

cevap

20

MSDN'ın DllMain belgelerine diyor: DLL C çalışma zamanı kitaplığı (CRT) CRT tarafından sağlanan noktası küresel ve için kurucular ve yıkıcı çağırır girişi ile bağlantılıdır

ise Statik C++ nesneleri. Bu nedenle, DllMain için bu kısıtlamalar ayrıca kurucular ve yıkıcılar ve bunlardan çağrılan kodları için de geçerlidir. Bu DLL_PROCESS_DETACH çalıştırılır sonra

DllMain'de içindeki kod statik nesneleri kullanabilir yana

, statik nesneleri DllMain'de DLL_PROCESS_ATTACH çalıştırılan önce inşa edilmiş, ve imha edilmesi gerekir.

Bunu basit bir test örneği ve test dll ile doğrulayabilirsiniz.

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:

Birlikte
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; 
} 

olanlar yazdırır: Gördüğünüz gibi, statik nesne DllMain(...,DLL_PROCESS_ATTACH,...) önce inşa ve DllMain(...,DLL_PROCESS_DETACH,...) sonra imha edilir

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

İlgili konular