Módulo de estados de uma DLL Regular dinamicamente vinculada ao MFC
A capacidade de ligar dinamicamente uma DLL regular para a DLL da MFC permite algumas configurações que são muito complicadas. Por exemplo, uma DLL regular e o executável que o utiliza podem ambos dinamicamente link para a DLL da MFC e as DLLs de extensão.
Essa configuração representa um problema com relação aos dados globais de MFC, como, por exemplo, o ponteiro para a atual CWinApp mapas de objeto e a alça.
Antes da versão 4.0 do MFC, esses dados globais residiam na DLL do MFC e foi compartilhados por todos os módulos no processo. Como cada processo usando uma DLL Win32 obtém sua própria cópia dos dados da DLL, este esquema fornecido uma maneira fácil de controlar os dados por processo. Além disso, porque o modelo AFXDLL presumed que deve haver apenas um CWinApp objeto e apenas um conjunto de lidar com mapas do processo, esses itens podem ser controlados na DLL do MFC.
Mas com a capacidade de ligar dinamicamente uma DLL regular para a DLL da MFC, é possível ter dois ou mais CWinApp objetos em um processo — e também dois ou mais conjuntos de mapas de manipular. Como MFC controlar de quais deve usar?
A solução é fornecer sua própria cópia dessas informações de estado global de cada módulo (aplicativo ou DLL regular). Assim, uma chamada para AfxGetApp na DLL regular retorna um ponteiro para o CWinApp o objeto na DLL, não aquele do executável. Esta cópia por módulo de dados MFC globais é conhecida como um estado de módulo e está descrita na 58 de observação do MFC Tech.
O procedimento de janela comum do MFC alterna automaticamente para o estado do módulo correto, para que você não precisa se preocupar em quaisquer manipuladores de mensagens implementados na sua DLL regular. Mas, quando seu executável chama-se a dll regular, você precisa definir explicitamente o estado atual do módulo para aquela para a DLL. Para fazer isso, use o AFX_MANAGE_STATE macro em cada função exportado da DLL. Isso é feito adicionando a seguinte linha de código para o início das funções exportadas da DLL:
AFX_MANAGE_STATE(AfxGetStaticModuleState( ))