Compartilhar via


DLLs normais dinamicamente vinculadas ao MFC

Uma DLL regular vinculada dinamicamente a MFC é uma DLL que usa internamente o MFC e as funções exportadas na DLL podem ser chamadas por arquivos executáveis do MFC ou de não-MFC. Como o nome descreve, esse tipo de DLL é construído usando a versão da biblioteca de vínculo dinâmico do MFC (também conhecido como a versão compartilhada do MFC). Funções geralmente são exportadas de uma DLL regular usando a interface c padrão.

Você deve adicionar o AFX_MANAGE_STATE macro no início de todas as funções exportadas DLLs normais que vincular dinamicamente ao MFC para definir o estado atual do módulo para aquele 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( ))

Uma DLL regular, vinculada dinamicamente a MFC tem os seguintes recursos:

  • Este é um novo tipo de DLL introduzida pelo Visual C++ 4.0.

  • O executável do cliente pode ser escrito em qualquer linguagem que suporta o uso de DLLs (C, C++, Pascal, Visual Basic e assim por diante); ele não tem de ser um aplicativo MFC.

  • Diferentemente a DLL regular estaticamente vinculada, esse tipo de DLL está vinculado dinamicamente a DLL da MFC (também conhecido como compartilhada DLL da MFC).

  • A biblioteca de importação do MFC vinculada a esse tipo de DLL é o mesmo usado para DLLs de extensão ou de aplicativos usando a DLL da MFC: . Lib do MFCxx (D).

Uma DLL regular, vinculada dinamicamente a MFC tem os seguintes requisitos:

  • Essas DLLs são compiladas com _AFXDLL definido, como um executável que está vinculado dinamicamente a DLL da MFC. Mas _USRDLL também é definida, assim como uma DLL regular que esteja vinculada ao MFC.

  • Esse tipo de DLL deve instanciar um CWinApp-derivada da classe.

  • Esse tipo de DLL usa a DllMain fornecido pelo MFC. Colocar todos os código de inicialização DLL específica no InitInstance código de função e o encerramento de membro na ExitInstance como em um aplicativo MFC normal.

Como esse tipo de DLL usa a versão da biblioteca de vínculo dinâmico do MFC, você deve definir explicitamente o estado atual do módulo para aquela para a DLL. Para fazer isso, use o AFX_MANAGE_STATE exportadas de macro no início de cada função da DLL.

DLLs normais devem ter um CWinApp-derivado de classe e um único objeto dessa classe de aplicativo, como um aplicativo MFC. No entanto, o CWinApp o objeto da DLL não tem uma bomba de mensagem principal, como faz o CWinApp o objeto de um aplicativo.

Observe que o CWinApp::Run mecanismo não se aplicam a uma DLL, porque o aplicativo que detém a bomba de mensagem principal. Se sua DLL traz caixas de diálogo sem janela restrita ou tem uma quadro principal sua própria janela, bomba de mensagem principal do aplicativo deve chamar uma rotina exportados a DLL que chama CWinApp::PreTranslateMessage.

Colocar todas as DLL específica na CWinApp::InitInstance a função de membro como em um aplicativo MFC normal. O CWinApp::ExitInstance a função de membro de sua CWinApp classe derivada é chamado a partir do MFC fornecido DllMain funcionar antes que a DLL é descarregada.

Você deve distribuir o MFCx0.dll de DLLs compartilhadas e Msvcr*0.dll (ou arquivos similares) com seu aplicativo.

Uma DLL que está dinamicamente vinculada ao MFC também estaticamente não é possível vincular ao MFC. Link de aplicativos para DLLs normais vinculadas dinamicamente a MFC-lo exatamente como qualquer outro tipo de DLL.

Símbolos geralmente são exportados de uma DLL regular usando a interface c padrão. A declaração de uma função exportada por uma DLL regular pode ter esta aparência:

extern "C" __declspec(dllexport) MyExportedFunction( );

Todas as alocações de memória dentro de uma DLL regular devem permanecer na DLL; a DLL não deve passar para ou receber do executável chamar qualquer um dos seguintes:

  • ponteiros para objetos do MFC

  • ponteiros para a memória alocada pelo MFC

Se você precisar executar qualquer uma das opções acima, ou se você precisar passar objetos derivados de MFC entre o executável de chamada e a DLL, você deve construir uma DLL de extensão.

É seguro passar ponteiros de memória que foram alocados pelas bibliotecas do tempo de execução c entre um aplicativo e uma DLL somente se você fazer uma cópia dos dados. Você não deve excluir ou redimensionar esses ponteiros ou usá-los sem fazer uma cópia da memória.

Ao criar uma DLL regular que dinamicamente vincula ao MFC, você precisa usar a macro AFX_MANAGE_STATE para alternar o estado do módulo MFC corretamente. Isso é feito adicionando a seguinte linha de código para o início das funções exportadas da DLL:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

O AFX_MANAGE_STATE macro não deve ser usada em DLLs normais do que se vinculam estaticamente ao MFC ou em DLLs de extensão. Para obter mais informações, consulte Gerenciando os dados de estado de módulos de MFC.

Para obter um exemplo de como gravar, criar e usar uma DLL regular, consulte o exemplo de DLLScreenCap. Para obter mais informações sobre DLLs normais que ligar dinamicamente a MFC, consulte a seção intitulada "Conversão de DLLScreenCap para dinamicamente Link com MFC DLL" em Resumo da amostra.

O que você deseja fazer?

O que você deseja saber mais a respeito?

Consulte também

Conceitos

Tipos de DLLs