Partilhar via


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.

Confira também

Gerenciando os dados de estado dos módulos MFC