Em quais casos o CRT dinâmico ainda não foi inicializado na chamada ao DllMain fornecido pelo usuário?

Preâmbulo: Esta questão está especificamente preocupada com, e somente com, o comportamento dodinâmico CRT usado através/MD. Não questiona a validade de outras recomendações erradas.DllMain.

Comonos disseram: (ref: Práticas recomendadas de biblioteca de vínculo dinâmico, MSDN, 17 de maio de 2006)

Você nunca deve executar as seguintes tarefas no DllMain:

...Use a função de gerenciamento de memória dodinâmico C Tempo de execução (CRT). Se a DLL do CRT não for inicializada, as chamadas para essas funções poderão causar falha no processo....

Outrasquestionou isso já (como em: questionou a validade do argumento) e, como recebemos uma resposta útil lá, podemos ver claramente umasimples caso em que isso poderiapotencialmente causar problemas:

Você está trabalhando com a suposição de que o ponto de entrada para uma DLL é sempre _DllMainCRTStartup. Este não é o caso, é apenas o padrão do vinculador. Pode ser qualquer coisa que um programador deseje que seja, rápida e facilmente alterada com a opção / ENTRYPOINT do vinculador. Não há nada que a Microsoft possa fazer para evitar isso.

Portanto, estes são os elementos desta pergunta:

Existequalquer outro situação ao vincular/MD enão fornecendo um costume/ENTRYPOINT, onde odinâmico O CRT não deve ser totalmente inicializado?

Especificamente, se todo o carregamento da DLL for feito apenas através de "dependências estáticas", ou seja, sem explícitaLoadLibrarychamadas, basta vincular as dependências de DLL do tempo.

Bônus: os documentos da MS chamam especificamente"função de gerenciamento de memória", mas até onde sei, se o CRT não for inicializado, potencialmentequalquer A função CRT deve ser insegura. Por que chamar as funções de gerenciamento de memória dessa maneira?

N ° 3:

Wrt. para o costumeENTRYPOINT: Eu não vejo bem como esse cenário pode ser tão importante que precise ser incluído na lista não faça DllMain sem qualificação adicional.IFF Eu forneço um ponto de entrada personalizado, sou responsável por inicializar corretamente o CRT ou oO CRT não funcionará corretamente em nenhum lugar do meu programa, não apenas DllMain. Por que chamar a parte DllMain especificamente?

Isso me leva de volta à Q.1, a saber, se este é o único cenário em que isso é problemático para odinâmico CRT. Um esclarecimento ou esclarecimento dos motivos pelos quais isso seria mais importante para o DllMain que seria apreciado em outras partes da DLL, ou no que eu poderia sentir falta aqui.

Links de bônus:

Quando os objetos globais são construídos e destruídos pelo Visual C ++?DllMain: uma história de horrorChamando LoadLibrary de DllMain

Fundamentação da petição: Acho que devo adicionar isso para o contexto: estou perguntando isso porque temosmaciço quantidades de código fazendo coisas através de construtores de objetos C ++ globais. Coisas que realmente quebraram foram examinadas ao longo dos anos (como concorrentesLoadLibrary, sincronização de threads etc.), mas todo o código está cheio destd Funções C ++ e CRT, que felizmente trabalham há anos no Windows XP, 7 e Windows 10 sem nenhum problema. Enquanto estounão para chorar "mas funciona", tenho que fazer um julgamento de engenharia aqui sobre se existe algum valor de curto a médio na tentativa de "consertar" isso. Portanto, eu apreciaria se as respostas da caixa de sabão pudessem ser deixadas em suas caixas.

questionAnswers(1)

yourAnswerToTheQuestion