El código en las secciones de inicialización de las unidades en la DLL se ejecutará cuando la DLL se cargue por primera vez en el proceso. Las secciones de finalización se activan cuando el archivo DLL se descarga del proceso.
Eugene tiene razón en que puede tener un control más detallado utilizando DLLProc, pero esto solo suele ser necesario para los recursos por subproceso, p. hilo de almacenamiento local.
Me gustaría señalar que existen serias limitaciones en lo que se puede hacer durante DLLMain que es en última instancia donde estas secciones de inicialización/finalización se originan cuando están dentro de una biblioteca. La documentación de MSDN básicamente dice que puede hacer algunas cosas, pero que no hay una lista de comportamiento aceptable. Lo más cerca que se puede encontrar es decir que puede llamar a funciones en kernel32. ¡De lo contrario, todas las apuestas están apagadas!
Hay muchos artículos en la web que describen el problema, pero más allá del tema de MSDN para DLLMain que he vinculado anteriormente, recomendaría leer el Best Practices for Creating DLLs de Microsoft.
El consejo útil que MSDN ofrece es que la biblioteca puede exigir que sus usuarios invoquen una función de inicialización antes de usar la DLL. Se llamaría una función de finalización correspondiente una vez que haya terminado con la DLL. El uso de comctl32.dll adopta este modismo, ver InitCommonControlsEx.
En mi propio código prefiero un enfoque alternativo. Las secciones de inicialización de todas mis unidades registran los métodos de inicialización y finalización. Luego, en la primera llamada a cualquier función exportada de mi biblioteca, se ejecutan los métodos de inicialización, en el orden en que se registraron.Esto no es un problema para mí implementar porque ya estoy controlando todos los puntos de entrada/salida a mi biblioteca.
Me doy cuenta de que esto es más de lo que pedía, pero puede que le resulte útil evitar algunos problemas difíciles de depurar.
+1. En resumen, se llamará al código en una sección de finalización *, pero debido al bloqueo del cargador del sistema operativo, es posible que no lo desee. Evite un posible punto muerto: exporte funciones de inicialización y finalización explícitas para que el proceso de host llame. –
The Old New Thing explica por qué: http://blogs.msdn.com/b/oldnewthing/archive/2004/01/27/63401.aspx –
@Jeroen Iba a vincular a ese artículo, pero eso es un poco el huevo de un comisario y los artículos que relaciona a Raymond parecen haber sido comidos por MS link rot. La mejor referencia que he encontrado es http://www.microsoft.com/whdc/driver/kernel/DLL_bestprac.mspx –