Compartilhar via


Estados de módulo de uma DLL MFC regular vinculada dinamicamente ao MFC

A capacidade de vincular dinamicamente uma DLL MFC regular à DLL MFC permite algumas configurações que são muito complicadas. Por exemplo, uma DLL MFC regular e o executável que o usa podem vincular dinamicamente à DLL MFC e a quaisquer DLLs de extensão MFC.

Essa configuração apresenta um problema em relação aos dados globais do MFC, como o ponteiro para o objeto CWinApp atual e os mapas de identificador.

Antes da versão 4.0 do MFC, esses dados globais residiam na própria DLL do MFC e eram compartilhados por todos os módulos no processo. Como cada processo usando uma DLL do Win32 obtém sua própria cópia dos dados da DLL, esse esquema forneceu uma maneira fácil de rastrear dados por processo. Além disso, como o modelo AFXDLL presumia que haveria apenas um objeto CWinApp e apenas um conjunto de mapas de identificador no processo, esses itens poderiam ser rastreados na própria DLL MFC.

Mas com a capacidade de vincular dinamicamente uma DLL MFC regular à DLL MFC, agora é possível ter dois ou mais objetos CWinApp em um processo e também dois ou mais conjuntos de mapas de identificador. Como o MFC controla quais devem ser usados?

A solução é fornecer a cada módulo (aplicativo ou DLL MFC regular) sua própria cópia dessas informações de estado global. Assim, uma chamada para AfxGetApp na DLL MFC regular retorna um ponteiro para o objeto CWinApp na DLL, não aquele no executável. Essa cópia por módulo dos dados globais do MFC é conhecida como um estado de módulo e é descrita no MFC Tech Note 58.

O procedimento de janela comum MFC alterna automaticamente para o estado correto do módulo, portanto, você não precisa se preocupar com isso em nenhum manipulador de mensagens implementado em sua DLL MFC regular. Mas quando suas chamadas executáveis para a DLL MFC regular, você precisa definir explicitamente o estado do módulo atual como aquele para a DLL. Para fazer isso, use a macro AFX_MANAGE_STATE em cada função exportada da DLL. Isso é feito adicionando a seguinte linha de código ao início das funções exportadas da DLL:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

Que mais você deseja saber?

Confira também

Criar DLLs C /C++ no Visual Studio