DLLs do MFC regulares vinculadas estaticamente ao MFC

Uma DLL do MFC regular vinculada estaticamente ao MFC é uma DLL que usa o MFC internamente, e as funções exportadas na DLL podem ser chamadas por executáveis que sejam ou não MFC. Como o nome descreve, esse tipo de DLL é criado usando a versão da biblioteca de links estáticos do MFC. As funções geralmente são exportadas de uma DLL do MFC regular usando a interface padrão do C. Para obter um exemplo de como escrever, compilar e usar uma DLL do MFC regular, veja o exemplo DLLScreenCap.

Observe que o termo USRDLL não é mais usado na documentação do Visual C++. Uma DLL do MFC regular que esteja estaticamente vinculada ao MFC tem as mesmas características que a antiga USRDLL.

Uma DLL MFC regular, estaticamente vinculada ao MFC, tem os seguintes recursos:

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

  • A DLL pode vincular-se às mesmas bibliotecas de link estático do MFC usadas por aplicativos. Não há mais uma versão separada das bibliotecas de link estático para DLLs.

  • Antes da versão 4.0 do MFC, as USRDLLs forneciam o mesmo tipo de funcionalidade que as DLLs do MFC regulares estaticamente vinculadas ao MFC. A partir do Visual C++ versão 4.0, o termo USRDLL ficou obsoleto.

Uma DLL do MFC regular, estaticamente vinculada ao MFC, tem os seguintes requisitos:

  • Esse tipo de DLL deve instanciar uma classe derivada de CWinApp.

  • Esse tipo de DLL usa o DllMain fornecido pelo MFC. Coloque todo o código de inicialização específico da DLL na função membro InitInstance e no código de encerramento ExitInstance como em um aplicativo normal do MFC.

  • Embora o termo USRDLL esteja obsoleto, você ainda deve definir "_USRDLL" na linha de comando do compilador. Essa definição determina quais declarações são extraídas dos arquivos de cabeçalho do MFC.

DLLs do MFC regulares devem ter uma classe derivada de CWinApp e um único objeto dessa classe de aplicativo, assim como em um aplicativo do MFC. No entanto, o objeto CWinApp da DLL não tem uma bomba de mensagens principal, assim como o objeto CWinApp de um aplicativo.

Observe que o mecanismo CWinApp::Run não se aplica a uma DLL, pois o aplicativo é proprietário da bomba de mensagens principal. Se a DLL abrir caixas de diálogo sem modelo ou tiver uma janela própria de quadro principal, a bomba de mensagens principal do aplicativo deverá chamar uma rotina exportada pela DLL que, por sua vez, chamará a função membro CWinApp::PreTranslateMessage do objeto de aplicativo da DLL.

Para obter um exemplo dessa função, consulte o exemplo DLLScreenCap.

Os símbolos geralmente são exportados de uma DLL do MFC regular usando a interface padrão do C. A declaração de uma função exportada de uma DLL do MFC regular seria semelhante a esta:

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

Todas as alocações de memória em uma DLL do MFC regular devem permanecer dentro da DLL; a DLL não deve passar nem receber do executável da chamada qualquer um dos seguintes itens:

  • Ponteiros para objetos do MFC

  • Ponteiros para a memória alocados pelo MFC

Se precisar fazer qualquer um dos itens acima ou precisar passar objetos derivados do MFC entre o executável da chamada e a DLL, você deverá criar uma DLL de extensão do MFC.

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

Uma DLL que esteja estaticamente vinculada ao MFC também não pode vincular dinamicamente às DLLs compartilhadas do MFC. Uma DLL que esteja estaticamente vinculada ao MFC está vinculada dinamicamente a um aplicativo, assim como qualquer outra DLL; os aplicativos vinculam a ele, assim como qualquer outra DLL.

As bibliotecas de link estático padrão do MFC são nomeadas de acordo com a convenção descrita em Convenções de Nomenclatura para DLLs do MFC. No entanto, com o MFC versão 3.0 e posterior, não é mais necessário especificar manualmente ao vinculador a versão da biblioteca do MFC na qual você deseja vincular. Em vez disso, os arquivos de cabeçalho do MFC determinam automaticamente a versão correta da biblioteca do MFC para vincular com base em definições do pré-processador, como _DEBUG ou _UNICODE. Os arquivos de cabeçalho do MFC adicionam diretivas /DEFAULTLIB instruindo o vinculador a vincular em uma versão específica da biblioteca do MFC.

O que você deseja fazer?

Que mais você deseja saber?

Confira também

Tipos de DLLs