Compartilhar via


Módulo estados de uma DLL Regular dinamicamente vinculada ao MFC

A capacidade de vincular uma DLL regular dinamicamente a DLL do MFC permite algumas configurações que são muito complicadas.Por exemplo, uma DLL regular e o executável utiliza podem ambos dinamicamente link para a DLL do MFC e as DLLs de extensão.

Esta configuração apresenta um problema com relação a dados globais MFC, como o ponteiro para o atual CWinApp mapas de objeto e a alça.

Antes de MFC versão 4.0, esse 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, esse esquema fornecido uma maneira fácil de controlar dados por processo.Também, porque o modelo AFXDLL presumed que teria apenas uma CWinApp objeto e apenas um conjunto de manipulam mapas do processo, esses itens poderiam ser controlados na DLL do MFC.

Mas com a capacidade de vincular uma DLL regular dinamicamente a DLL do MFC, é possível ter dois ou mais CWinApp objetos em um processo — e também dois ou mais conjuntos de mapas de identificador.Como MFC controlar de quais deve usar?

A solução é dar sua própria cópia das 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 objeto na DLL não aquele no executável.Esta cópia de módulo de dados globais MFC é conhecida como um estado de módulo e está descrita na MFC técnico Observação 58.

O procedimento de janela comuns MFC automaticamente alterna para o estado do módulo correto, portanto não precisa se preocupar em quaisquer manipuladores de mensagens implementadas na DLL regular.Mas quando seu executável chama a dll regular, você precisa definir explicitamente o estado atual do módulo para o outro para a DLL.Para fazer isso, use o AFX_MANAGE_STATE macro em cada função exportada da DLL.Isso é feito adicionando a seguinte linha de código para o início de funções exportadas da DLL:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

O que você deseja saber mais sobre?

Consulte também

Conceitos

DLLs no Visual C++