Pergunta

Estou escrevendo uma DLL que precisa chamar uma DLL separada dinamicamente várias vezes. Eu gostaria de manter o callee carregado e depois descarregá -lo quando minha DLL estiver descarregada. Mas de acordo com a Microsoft, isso é um péssima ideia.

A função do ponto de entrada deve executar apenas tarefas simples de inicialização e não deve chamar outras funções de carregamento ou terminação de DLL. Por exemplo, na função do ponto de entrada, você não deve chamar direta ou indiretamente a função de biblioteca de carga ou a função LoadLibraryEx. Além disso, você não deve chamar a função freel da biblioteca quando o processo estiver terminando.

Aqui está o código ofensivo. Alguém pode explicar por que eu não deveria chamar a biblioteca de carga e a biblioteca do meu ponto de entrada da minha DLL?

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
switch (ul_reason_for_call) {
    case DLL_PROCESS_DETACH :
            if (hLogLib != NULL) FreeLibrary(hLogLib);
            break;
    }
    return TRUE;
}
Foi útil?

Solução

Eu acho que encontrei a resposta.

A função de ponto de entrada deve executar apenas tarefas simples de inicialização ou terminação. Ele não deve chamar a função LoadLibrary ou LoadLibraryEx (ou uma função que chama essas funções), porque isso pode criar loops de dependência na ordem de carga DLL. Isso pode resultar em uma DLL sendo usada antes que o sistema execute seu código de inicialização. Da mesma forma, a função de ponto de entrada não deve chamar a função freel da biblioteca (ou uma função que chama a Freelibrary) durante a terminação do processo, porque isso pode resultar em uma DLL sendo usada após o sistema executar seu código de terminação.

Outras dicas

Você não pode ligar para o LoadLibrary do seu ponto de entrada porque a função DLLMain é executada dentro de um bloqueio de carregador do sistema operacional e quaisquer tentativas de require o bloqueio do carregador (por exemplo, chamando LoadLibrary) resultarão em impasse.

Não faça qualquer coisa de conseqüência Dentro de Dllmain. Seriamente. Chamar a Freelibrary é ainda pior porque só vai as vezes Deadlock, se isso acontecer, que você diminui o refco de zero e a biblioteca é realmente libertada.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top