Inicialización de CRT y DLLMain
Citas:
Del documento "Mejores prácticas para crear archivos DLL"http://download.microsoft.com/download/a/f/7/af7777e5-7dcd-4800-8a0a-b18336565f5b/DLL_bestprac.doc de Microsoft:
"Las DLL a menudo tienen interdependencias complejas que definen implícitamente el orden en que deben cargarse. El cargador de la biblioteca analiza de manera eficiente estas dependencias, calcula el orden de carga correcto y carga las DLL en ese orden".[1]
"(dentro de DLLMain) Use la función de administración de memoria del tiempo de ejecución dinámico C (CRT). Si la DLL CRT no se inicializa, las llamadas a estas funciones pueden hacer que el proceso se bloquee".[2]
Desde MSDN:http://msdn.microsoft.com/en-us/library/988ye33t.aspx
"La función _DllMainCRTStartup hace varias cosas, incluida la llamada _CRT_INIT, que inicializa la biblioteca de tiempo de ejecución C / C ++ e invoca constructores de C ++ en variables estáticas, no locales. Sin esta función, la biblioteca de tiempo de ejecución quedaría en un estado no inicializado ".[3]
"Además de inicializar la biblioteca de tiempo de ejecución C, _DllMainCRTStartup llama a una función llamada DllMain".[4]
Preguntas:
Si su DLL depende de CRT DLL, basado en[1], Las DLL CRT se cargarán primero (se inicializarán primero), así que ¿cómo[2] podría pasar ?
Residencia en[3] y[4], _DllMainCRTStartup llamará a _CRT_INIT que inicializa el CRT, entonces, ¿cómo[2] podría pasar ?
Si un archivo ejecutable carga su DLL mediante "Enlace implícito", se llamará a _DllMainCRTStartup (y DLLMain) de su DLL antes del punto de entrada (mainCRTStartup o WinMainCRTStartup) del archivo ejecutable, basado en[3] - _DllMainCRTStartup llama a _CRT_INIT que inicializa el CRT, y mainCRTStartup también va a inicializar el CRT, entonces, ¿qué pasó realmente con el CRT?
Si su DLL se cargará antes de mainCRTStartup, ¿la llamada a las funciones CRT dentro de DLLMain u otras funciones de exportación es segura o no?
¿Quién inicializará las DLL CRT en realidad?