Inicialização de CRT e DLLMain
Citações:
No documento "Práticas recomendadas para criar DLLs"http://download.microsoft.com/download/a/f/7/af7777e5-7dcd-4800-8a0a-b18336565f5b/DLL_bestprac.doc da Microsoft:
"As DLLs geralmente têm interdependências complexas que definem implicitamente a ordem em que devem ser carregadas. O carregador da biblioteca analisa essas dependências com eficiência, calcula a ordem de carregamento correta e carrega as DLLs nessa ordem."[1]
"(dentro do DLLMain) Use a função de gerenciamento de memória do CRT (C Run-Time) dinâmico. Se a DLL do CRT não for inicializada, as chamadas para essas funções poderão causar falhas no processo."[2]
Do MSDN:http://msdn.microsoft.com/en-us/library/988ye33t.aspx
"A função _DllMainCRTStartup faz várias coisas, incluindo a chamada _CRT_INIT, que inicializa a biblioteca de tempo de execução C / C ++ e chama construtores C ++ em variáveis estáticas e não locais. Sem essa função, a biblioteca de tempo de execução seria deixada em um estado não inicializado. . "[3]
"Além de inicializar a biblioteca de tempo de execução C, _DllMainCRTStartup chama uma função chamada DllMain."[4]
Questões:
Se sua DLL depende de DLLs CRT, com base em[1], As DLLs de CRT serão carregadas primeiro (serão inicializadas primeiro), então como[2] poderia acontecer ?
Baseado em[3] e[4], _DllMainCRTStartup chama _CRT_INIT, que inicializa o CRT, então como[2] poderia acontecer ?
Se um arquivo executável carregar sua DLL por "Vinculação implícita", o _DllMainCRTStartup (e DLLMain) da sua DLL será chamado antes do ponto de entrada (mainCRTStartup ou WinMainCRTStartup) do arquivo executável, com base em[3] - _DllMainCRTStartup chama _CRT_INIT, que inicializa o CRT, e o mainCRTStartup também inicializa o CRT, então o que realmente aconteceu com o CRT?
Se a sua DLL for carregada antes da inicialização do mainCRTS, a chamada para as funções CRT no DLLMain ou outras funções de exportação é segura ou não?
Quem realmente inicializará as DLLs de CRT?