¿En qué casos el CRT dinámico aún no se ha inicializado en la llamada al DllMain proporcionado por el usuario?

Preámbulo: Esta pregunta está específicamente relacionada con, y solo con, el comportamiento deldinámica CRT utilizado a través de/MD. No cuestiona la validez de ninguna otra recomendación wrt.DllMain.

Comonos han dicho: (ref: Mejores prácticas de la biblioteca Dynamic-Link, MSDN, 17 de mayo de 2006)

Nunca debe realizar las siguientes tareas desde DllMain:

...Utilice la función de gestión de memoria desdedinámica C Tiempo de ejecución (CRT). Si la DLL CRT no se inicializa, las llamadas a estas funciones pueden hacer que el proceso se bloquee....

Otroshe cuestionado esto ya (como en: cuestionó la validez del argumento) y dado que obtenemos una respuesta útil allí, podemos ver claramente una bastantesencillo caso donde esto podríapotencialmente causar problemas:

Está trabajando desde el supuesto de que el punto de entrada para una DLL siempre es _DllMainCRTStartup. Este no es el caso, es simplemente el valor predeterminado del vinculador. Puede ser cualquier cosa que un programador quiera que sea, cambiada rápida y fácilmente con la opción de enlace / ENTRYPOINT. No hay nada que Microsoft pueda hacer para evitar esto.

Estos son los elementos de esta pregunta:

Esta ahícualquier otro situación al vincular/MD yno suministro de una costumbre/ENTRYPOINT, donde eldinámica ¿La CRT no debe ser completamente inicializada?

Específicamente, si toda la carga de DLL solo se realiza a través de "dependencias estáticas", es decir, no explícitaLoadLibraryllamadas en absoluto, solo depende del tiempo de enlace de las dependencias de DLL.

Bonificación: los documentos de MS llaman específicamente"función de gestión de memoria", pero por lo que puedo decir, si el CRT no se inicializa, potencialmentealguna La función CRT no debería ser segura. ¿Por qué llamar las funciones de administración de memoria de esta manera?

Numero 3:

Wrt. a la costumbreENTRYPOINT: No entiendo cómo puede ser un escenario tan importante que deba incluirse en la lista de no hacer en DllMain sin más calificación.IFF Proporciono un punto de entrada personalizado, soy responsable de inicializar correctamente el CRT oCRT no funcionará correctamente en ningún lugar de mi programa, no solo DllMain. ¿Por qué llamar específicamente a la parte DllMain?

Esto me lleva de vuelta a la P.1, es decir, si este es el único escenario en el que esto es problemático para eldinámica CRT. Una aclaración o revelación de por qué esto sería más importante para DllMain que para otras partes de la DLL, o lo que podría extrañar aquí, sería apreciado.

Enlaces de bonificación:

¿Cuándo se visualizan y destruyen los objetos globales por Visual C ++?DllMain: una historia de terrorLlamar a LoadLibrary desde DllMain

Razón fundamental o base lógica: Siento que debería agregar esto para el contexto: estoy preguntando esto porque tenemosmasivo cantidades de código que hacen cosas a través de constructores de objetos globales de C ++. Las cosas que realmente se rompieron se han examinado a lo largo de los años (como concurrentesLoadLibrary, sincronización de subprocesos, etc.), pero todo el código está lleno destd Funciones de C ++ y CRT, que felizmente han estado funcionando durante años en Windows XP, 7 y Windows 10 sin ningún inconveniente conocido. Mientras estoyno uno para llorar "pero simplemente funciona", tengo que hacer un juicio de ingeniería aquí sobre si hay algún valor de corto a medio al tratar de "arreglar" esto. Por lo tanto, agradecería que las respuestas de la caja de jabón se pudieran dejar en sus cajas.

Respuestas a la pregunta(1)

Su respuesta a la pregunta