Exemplo do DLLHUSK: Vínculos dinamicamente a biblioteca MFC

A amostra DLLHUSK links dinamicamente a biblioteca MFC para aplicativos e personalizadas bibliotecas de vínculo dinâmico (DLL) compartilhando o mesmo código da biblioteca de classes, reduzindo assim o total de memória necessária para executar vários aplicativos.

Vinculando dinamicamente a MFC também oferece outras arquiteturas de aplicativos possível em que parte do aplicativo é implementado em uma DLL personalizada e o aplicativo e o compartilhamento DLL personalizado a DLL da MFC (Mfcxx.dll).Uma DLL personalizada que compartilha estrutura funcionalidade com um aplicativo é conhecida como uma DLL de extensão do MFC.

Observação de segurança:

Este código de exemplo é fornecido para ilustrar um conceito e não deve ser usado em aplicativos ou sites da Web, pois ele não pode ilustrar sistema autônomo práticas de codificação mais seguras.Microsoft sistema autônomo sumes nenhuma responsabilidade por danos incidentais ou conseqüenciais deve o código de exemplo ser usado para fins diferentes de sistema autônomo se destina.

Para obter exemplos e instruções para instalá-los:

  • Sobre o Visual Studio Ajuda menu, clicar Exemplos.

    Para obter mais informações, consulte Localizando arquivos de exemplo.

  • A versão mais recente e a lista completa das Exemplos está disponível online a partir de O Visual Studio 2008 Exemplos página.

  • Você também pode localizar exemplos no disco rígido do seu computador.Por padrão, exemplos e um arquivo Leiame são copiados para uma pasta sob \programa Files\Visual Studio 9.0\Samples\.Para edições Express do Visual Studio, todos os exemplos estão localizados online.

Criando e executando o exemplo

Para criar e executar a amostra DLLHUSK

  1. Abra a solução dllhusk.sln.

  2. Sobre o Compilação menu, clicar Compilação.

  3. No menu Debug, clique em Start Without Debugging.

A solução DLLHUSK constrói o aplicativo Dllhusk.exe e as duas DLLs (TESTDLL1.DLL e TESTDLL2.DLL) ao qual o aplicativo está vinculado dinamicamente.DLLHUSK requer MFCxx.DLL ou MFCxxD.DLL em time de execução.Essas DLLs são instaladas por padrão no diretório de sistema do Windows.

DLLs de extensão do MFC DLLHUSK

DLLHUSK demonstra DLLs de extensão do MFC com exportações de classe.Classes C++ em DLLs (Testdll1.dll e Testdll2.dll) são exportadas usando a macro AFX_EXT_CLASS.A DLL de extensão do MFC primeiro (TESTDLL1) é aquele em que todas as interfaces de classe do C++ da DLL personalizada serão acessadas somente por estrutura, não diretamente pelo aplicativo.A DLL personalizada exporta apenas externFunções de "C" para o aplicativo. A DLL personalizada não é necessário exportar as funções das classes derivadas de classes do estrutura.Todas as chamadas de estrutura para classes derivadas na DLL personalizada são resolvidas por meio do mecanismo de função virtual C++.

O segundo DLL de extensão do MFC (TESTDLL2) é um no qual algumas interfaces de classe C++ da DLL personalizada são exportados para e acessados diretamente pelo aplicativo.

Testdll1.dll

Testdll1.dll fornece a implementação para as classes de documento e exibição do DLLHUSK para ambos tipos de documentos — o tipo de documento de texto e o HELLO tipo de documento.O Dllhusk.exe implementa a classe de janela de quadro MDI e a estrutura implementa vários documento MDI (interface) janela classe filha (CMDIChildWnd). Dois objetos de modelo de documento estabelecer as associações entre CTextDoc, CMDIChildWnd, e CEditView e entre CDummyDoc, CMDIChildWnd, e CHelloView. Portanto, DLLHUSK ilustra que a estrutura pode coordenar as relações entre os objetos definidos pelo framework, mesmo que as classes para esses objetos são implementados do aplicativo, personalizado (extensão do MFC) DLL e Mfcxx.dll da estrutura.

TESTDLL1 realmente chama AddDocTemplate função de membro duas vezes para registrar os objetos de modelo de dois documento. Isso é feito na implementação InitTestDLL1 função, que é a única função TESTDLL1 exporta. Esta função é declarada com extern"C" para que o aplicativo DLLHUSK pode chamá-lo sistema autônomo uma função C autônoma.

O arquivo de cabeçalho Testdll1.h (adicionado sistema autônomo um #include por Dllhusk.cpp) inclui não apenas da declaração do InitTestDLL1, mas também sistema autônomo declarações de classes do TESTDLL1. Dllhusk.cpp refere-se diretamente a somente a InitTestDLL1 função. Indiretamente, no entanto, DLLHUSK usa o documento e o modo de exibição de classes implementada no Testdll1.dll.

Testdll2.dll

Testdll2.dll fornece a implementação do DLLHUSK CListOutputFrame classe.Quando o usuário escolhe um comando de diagnóstico usando o menu de atalho, o aplicativo cria um CListOutputFrame objeto e, em seguida, envia mensagens de diagnóstico para a janela de saída de lista chamando CListOutputFrame::AddString.

Todas as funções de membro público de CListOutputFrame são exportadas no arquivo Testdll2.def.As exportações incluem não apenas AddString mas também o público CListOutputFrame construtor e destruidor.

É mais difícil implementar uma DLL que exporta as funções de membro de classe daquele que exporta funções apenas C de extensão do MFC.Isso é verdadeiro particularmente porque você deve adicionar manualmente as exportações de função decorada nome C++ da DLL .def arquivo.Portanto, uma técnica para fazer é explicada na Observação técnica 33.

Recursos adicionais de DLLHUSK

DLLHUSK também ilustra:

  • separação de recursos para um único aplicativo em vários arquivos .rc, que pode ser editado no editor de recursos do Visual C++.

  • Usando dois global diagnóstico funções, AfxDoForAllClasses e AfxDoForAllObjects.

  • Enumerando CDynLinkLibrary objetos.

Palavras-chave

Este exemplo demonstra as seguintes palavras-chave:

AfxDoForAllClasses; AfxDoForAllObjects; AfxGetApp; AfxGetResourceHandle; AfxMessageBox; AfxSetResourceHandle; AfxThrowMemoryException; CCmdUI::SetCheck; CColorDialog::DoModal; CColorDialog::GetColor; CDC::DrawText; CDC::SetBkColor; CDC::SetTextColor; CDialogBar::criar; CDocTemplate::GetDocString; CEditView::SerializeRaw; CFrameWnd::LoadFrame; CListBox::AddString; CListBox::criar; CListBox::GetCount; CListBox::GetText; CListBox::GetTextLen; CListBox::ResetContent; CListBox::SetCurSel; CMDIChildWnd::criar; CMenu::GetSubMenu; CMenu::LoadMenu; CMenu::TrackPopupMenu; CObject::AssertValid; CObject::despejo; CObject::Serialize; CStatusBar::criar; CStatusBar::SetIndicators; CToolBar::criar; CToolBar::LoadBitmap; CToolBar::SetButtons; CView::OnDraw; CWinApp::AddDocTemplate; CWinApp::InitInstance; CWinApp::LoadStdProfileSettings; CWinApp::OnFileNew; CWinApp::OpenDocumentFile; CWnd::GetClientRect; CWnd::GetCurrentMessage; CWnd::GetFont; CWnd::Invalidate; CWnd::OnCreate; CWnd::OnNcRButtonDown; CWnd::OpenClipboard; CWnd::SetFont; CWnd::ShowWindow; CWnd::UpdateWindow; CloseClipboard; EmptyClipboard; GetModuleFileName; GetSysColor; GlobalAlloc; GlobalLock; LOWORD; RGB; SetClipboardData; lstrlen; wsprintf

Observação:

Alguns exemplos, sistema autônomo esta, não foram modificados para refletir sistema autônomo alterações nos assistentes, bibliotecas e compilador Visual C++, mas ainda Demonstre sistema autônomo concluir a tarefa desejada.

Consulte também

Outros recursos

Exemplos do MFC