Pontos de entrada da função DLL exportada
Para funções exportadas de uma DLL, use a macro AFX_MANAGE_STATE para manter o estado global adequado ao alternar do módulo DLL para a DLL do aplicativo de chamada.
Quando chamada, essa macro define pModuleState
, um ponteiro para uma estrutura AFX_MODULE_STATE
que contém dados globais para o módulo, como o estado efetivo do módulo para o restante do escopo que contém a função. Ao sair do escopo que contém a macro, o estado de módulo efetivo anterior é restaurado automaticamente.
Essa alternância é obtida pela construção de uma instância de uma classe AFX_MODULE_STATE
na pilha. Em seu construtor, essa classe obtém um ponteiro para o estado do módulo atual e o armazena em uma variável membro, então define pModuleState
como o novo estado efetivo do módulo. Em seu destruidor, essa classe restaura o ponteiro armazenado em sua variável membro como o estado efetivo do módulo.
Se você tiver uma função exportada, como aquela que inicia uma caixa de diálogo em sua DLL, será necessário adicionar o seguinte código ao início da função:
AFX_MANAGE_STATE(AfxGetStaticModuleState())
Isso troca o estado do módulo atual pelo estado retornado de AfxGetStaticModuleState até o final do escopo atual.
Problemas com recursos em DLLs ocorrerão se a macro AFX_MANAGE_STATE
não for usada. Por padrão, o MFC usa o identificador de recurso do aplicativo principal para carregar o modelo de recurso. Esse modelo é armazenado na DLL. A causa raiz é que as informações de estado do módulo do MFC não foram alternadas pela macro AFX_MANAGE_STATE
. O identificador de recurso é recuperado do estado do módulo do MFC. Não alternar o estado do módulo faz com que o identificador de recurso incorreto seja usado.
AFX_MANAGE_STATE
não precisa ser colocado em todas as funções na DLL. Por exemplo, InitInstance
pode ser chamado pelo código MFC no aplicativo sem AFX_MANAGE_STATE
porque o MFC desloca automaticamente o estado do módulo antes de InitInstance
e então o alterna de volta depois do retorno de InitInstance
. O mesmo vale para todos os manipuladores de mapa de mensagens. As DLLs MFC na verdade têm um procedimento de janela mestre especial que alterna automaticamente o estado do módulo antes de rotear qualquer mensagem.