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