TN011: Usando o MFC sistema autônomo parte de uma DLL
Esta nota descreve DLLs regulares, que permitem que você use a biblioteca MFC sistema autônomo parte de uma biblioteca de vínculo dinâmico (DLL) do Windows.Ele presume que você esteja familiarizado com DLLs do Windows e como criá-los.Para obter informações sobre DLLs, com o qual você pode criar extensões para a biblioteca MFC, de extensão do MFC consulte Versão DLL do MFC.
Interfaces DLL
Regulares DLLs supõem interfaces entre o aplicativo e a DLL são especificados em funções do tipo C ou classes exportados explicitamente.Interfaces de classe do MFC não podem ser exportados.
Se uma DLL e um aplicativo quiser usar MFC, ambos tem a opção para usar tanto a versão compartilhada das bibliotecas de MFC ou estaticamente vincular a uma cópia das bibliotecas.O aplicativo e a DLL podem ambos use um das versões padrão da biblioteca MFC.
DLLs normais têm várias vantagens:
O aplicativo que usa a DLL não precisa usar MFC e não precisa ser um aplicativo Visual C++.
Com regulares DLLs vinculadas estaticamente a MFC, o dimensionar da DLL depende somente as rotinas de tempo de execução MFC e C que são usadas e vinculadas.
Com DLLs normais que vincular dinamicamente a MFC, a economia de memória de usar a versão do MFC compartilhada poderá ser significativa.No entanto, é necessário distribuir as DLLs compartilhadas, MFC <versão>.dll e Msvvcrt <versão> .dll, com sua DLL.
A DLL Design independe de como as classes são implementados.O projeto DLL exporta apenas para as APIs que você deseja.sistema autônomo resultado, se a implementação for alterada, DLLs normais são ainda válidas.
Com regulares DLLs vinculadas estaticamente a MFC, se DLL e o aplicativo usarem MFC, houver problemas com o aplicativo que deseja que uma versão diferente do MFC a DLL ou vice-versa.Como a biblioteca MFC está estaticamente vinculada em cada DLL ou EXE, não há nenhuma pergunta sobre qual versão você possui.
Limitações de API
Algumas funcionalidades do MFC não é válido para a versão de DLL, devido às limitações técnicas de ou porque esses serviços são geralmente fornecidos pelo aplicativo.Com a versão corrente do MFC, a única função que não seja aplicável é CWinApp::SetDialogBkColor.
Criando sua DLL
Durante a compilação de DLLs normais ou estaticamente vincular ao MFC, os símbolos de _USRDLL e _WINDLL deve ser definido. O código da DLL também deve ser compilado com as seguintes opções do compilador:
/D_WINDLL significa que a compilação é para uma DLL
/D_USRDLL Especifica que você está criando uma DLL regular
Você também deve definir esses símbolos e usar essas opções do compilador quando você compilar DLLs normais que vincular dinamicamente a MFC.Além disso, o símbolo _AFXDLL deve ser definida e seu código DLL deve ser compilado com:
- /D_AFXDLL Especifica que você esteja criando uma DLL regular dinamicamente vincula ao MFC
As interfaces (APIs) entre o aplicativo e a DLL devem ser exportadas explicitamente.Recomendamos define suas interfaces de ser pouca largura de banda e usar interfaces C somente se for possível.Interfaces C diretas são mais fáceis de manter que classes mais complexa do C++.
Coloque suas APIs em um cabeçalho separado que pode ser incluído por arquivos C e C++.Consulte o cabeçalho ScreenCap.h o MFC Advanced conceitos amostra DLLScreenCap para obter um exemplo.Para exportar suas funções, insira-as no EXPORTS seção de definição de módulo (.def) do arquivo ou incluir __declspec(dllexport) em suas definições de função. Use __declspec(dllimport) Para importar essas funções para o executável do cliente.
Você deve adicionar o AFX_MANAGE_STATE macro no início de todas as funções exportadas em DLLs normais que vincular dinamicamente a MFC. Esta macro define o estado corrente do módulo para o outro para a DLL.Para usar essa macro, adicione a seguinte linha de código para o início de funções exportadas da DLL:
AFX_MANAGE_STATE(AfxGetStaticModuleState( ))
WinMain-> DllMain
A biblioteca MFC define o padrão de Win32 DllMain ponto de entrada que inicializa o CWinApp objeto derivado sistema autônomo em um aplicativo típico do MFC.Coloque todos sistema autônomo inicialização DLL específicos no CWinAppEx método, sistema autônomo em um aplicativo típico do MFC.
Observe que o CWinApp::Run mecanismo não se aplica a uma DLL, porque o aplicativo que detém a bomba de mensagem principal. Se sua DLL exibe caixas de diálogo sem janela restrita ou tem uma quadro principal sua própria janela, bomba de mensagem principal do seu aplicativo deve telefonar uma rotina exportados DLL que telefonar s CWinApp::PreTranslateMessage.
Consulte o exemplo DLLScreenCap para usar essa função.
The DllMain função que fornece a MFC entrará em contato com o CWinApp::ExitInstance método de sua classe derivada de CWinApp antes que a DLL seja descarregada.
Vinculando A DLL
Com regulares DLLs vinculadas estaticamente a MFC, você deve vincular sua DLL com Nafxcwd.lib ou Nafxcw.lib e com a versão dos tempos de execução C, denominados Libcmt.lib.Essas bibliotecas são pré-desenvolvidas e podem ser instaladas, especificando-os ao executar o programa de instalação do Visual C++.
Código de Exemplo
Consulte o exemplo de conceitos avançados MFC DLLScreenCap de programa para obter um exemplo completo.Várias coisas interessantes observar neste exemplo são sistema autônomo segue:
Os sinalizadores de compilador da DLL e aqueles do aplicativo são diferentes.
Linhas de vínculo e arquivos .def para a DLL e aqueles do aplicativo são diferentes.
O aplicativo que usa a DLL não precisa estar em C++.
A interface entre o aplicativo e a DLL é uma API que pode ser usado por C ou C++ e será exportada com DLLScreenCap.def.
O exemplo a seguir ilustra uma API que é definida em uma DLL regular que se vincula estaticamente ao MFC.Neste exemplo, a declaração está contida em um extern "C" { } bloco para usuários do C++. Isso tem várias vantagens.Primeiro, faz sua DLL APIs utilizável por aplicativos clientes não-C++.Segundo, ele reduz a sobrecarga de DLL porque C++ desconfiguração do nome não será aplicado o nome exportado.Por fim, ele torna mais fácil adicionar explicitamente um arquivo .def (para exportar por ordinal) sem precisar se preocupar com a desconfiguração do nome.
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
struct TracerData
{
BOOL bEnabled;
UINT flags;
};
BOOL PromptTraceFlags(TracerData FAR* lpData);
#ifdef __cplusplus
}
#endif
As estruturas usadas pela API não são derivadas de classes do MFC e são definidas no cabeçalho da API.Isso reduz a complexidade da interface entre a DLL e o aplicativo e torna a DLL utilizáveis por programas em C.