Esempio DLLHUSK: collegamento dinamico della libreria MFC

Aggiornamento: novembre 2007

Nell'esempio DLLHUSK, la libreria MFC viene collegata in modo dinamico ad applicazioni e a DLL (dynamic-link library) personalizzate che condividono lo stesso codice di libreria di classi, riducendo così la memoria totale necessaria per l'esecuzione di più applicazioni.

Il collegamento a MFC in modo dinamico consente inoltre di realizzare diverse architetture di applicazioni, in cui parte dell'applicazione viene implementata in una DLL personalizzata e in cui l'applicazione e la DLL personalizzata condividono la stessa DLL MFC (Mfcxx.dll). Una DLL personalizzata che condivide la funzionalità del framework con un'applicazione viene definita DLL di estensione MFC.

Nota sulla sicurezza:

Questo esempio di codice viene fornito solo a scopo dimostrativo e non deve essere utilizzato in applicazioni o siti Web, poiché potrebbe non implementare le tecniche migliori a livello di sicurezza. Microsoft esclude ogni responsabilità per danni diretti o indiretti derivanti dall'utilizzo dell'esempio di codice per scopi diversi da quelli previsti.

Per ottenere gli esempi e le istruzioni per l'installazione:

  • In Visual Studio scegliere Esempi dal menu ?.

    Per ulteriori informazioni, vedere Individuazione dei file di esempio.

  • La versione più recente e l'elenco completo degli esempi sono disponibili in linea alla pagina Visual Studio 2008 Samples.

  • È anche possibile trovare gli esempi sul disco rigido del computer. Per impostazione predefinita, gli esempi e il file Leggimi vengono copiati in una cartella nel percorso \Programmi\Visual Studio 9.0\Samples\. Per le versioni Express di Visual Studio, tutti gli esempi sono disponibili in linea.

Generazione ed esecuzione dell'esempio

Per generare ed eseguire l'esempio DLLHUSK

  1. Aprire il file di soluzione dllhusk.sln.

  2. Scegliere Genera dal menu Genera.

  3. Scegliere Avvia senza eseguire debug dal menu Debug.

La soluzione DLLHUSK crea l'applicazione Dllhusk.exe e le due DLL (TESTDLL1.DLL e TESTDLL2.DLL) alle quali l'applicazione viene collegata in modo dinamico. DLLHUSK richiede MFCxx.DLL o MFCxxD.DLL in fase di esecuzione. Per impostazione predefinita, queste DLL vengono installate nella directory di sistema di Windows.

DLL di estensione MFC DLLHUSK

In DLLHUSK vengono illustrate le DLL di estensione MFC con le esportazioni di classi. Le classi C++ nelle DLL (Testdll1.dll e Testdll2.dll) vengono esportate utilizzando la macro AFX_EXT_CLASS. La prima DLL di estensione MFC (TESTDLL1) è una DLL in cui tutte le interfacce di classi C++ della DLL personalizzata vengono utilizzare solo dal framework e non direttamente dall'applicazione. La DLL personalizzata esporta solo funzioni extern "C" all'applicazione. Non è necessario che la DLL personalizzata esporti le funzioni di classi derivate da classi del framework. Tutte le chiamate dal framework alle classi derivate nella DLL personalizzata vengono risolte mediante il meccanismo della funzione virtual di C++.

La seconda DLL di estensione MFC (TESTDLL2) è una DLL in cui alcune interfacce di classi C++ della DLL personalizzata vengono esportate all'applicazione che le può utilizzare direttamente.

Testdll1.dll

Testdll1.dll fornisce l'implementazione per le classi visualizzazione e documento di DLLHUSK per entrambi i tipi di documento: TEXT e HELLO. Dllhusk.exe implementa la classe di finestra cornice MDI e il framework implementa la classe di finestra figlio MDI (CMDIChildWnd). I due oggetti modello di documento stabiliscono le associazioni tra CTextDoc, CMDIChildWnd e CEditView e tra CDummyDoc, CMDIChildWnd e CHelloView. In DLLHUSK, pertanto, viene dimostrato che il framework può coordinare le relazioni tra gli oggetti definiti dal framework, anche se le classi per questi oggetti vengono implementate nell'applicazione, nella DLL personalizzata (di estensione MFC) e nella DLL Mfcxx.dll del framework.

TESTDLL1 chiama due volte la funzione membro AddDocTemplate dell'oggetto applicazione per registrare i due oggetti modello di documento. Queste operazioni vengono effettuate nell'implementazione della funzione IInitTestDLL1 di TESTDLL1, che è l'unica funzione esportata da TESTDLL1. Questa funzione viene dichiarata con extern "C", in modo che l'applicazione DLLHUSK possa chiamarla come funzione C autonoma.

Nel file di intestazione Testdll1.h (aggiunto come #include da Dllhusk.cpp) sono incluse non solo la dichiarazione di InitTestDLL1, ma anche le dichiarazioni delle classi di TESTDLL1. Dllhusk.cpp fa riferimento direttamente solo alla funzione InitTestDLL1. Indirettamente, tuttavia, in DLLHUSK vengono utilizzate le classi visualizzazione e documento implementate in Testdll1.dll.

Testdll2.dll

Testdll2.dll fornisce l'implementazione per la classe CListOutputFrame di DLLHUSK. Quando l'utente sceglie un comando diagnostico utilizzando il menu di scelta rapida, l'applicazione crea un oggetto CListOutputFrame e invia i messaggi diagnostici alla finestra List Output, chiamando CListOutputFrame::AddString.

Tutte le funzioni membro pubbliche di CListOutputFrame vengono esportate nel file Testdll2.def. Le esportazioni includono non solo AddString, ma anche il distruttore e il costruttore pubblico CListOutputFrame.

È più difficile implementare una DLL di estensione MFC che esporta funzioni membro di classe piuttosto che implementare una DLL che esporta solo funzioni C. Tale considerazione deriva soprattutto dal fatto che è necessario aggiungere manualmente le esportazioni di funzioni con nomi decorati C++ al file DEF della DLL. Una tecnica per eseguire queste operazioni è illustrata nella Nota tecnica 33.

Funzionalità DLLHUSK aggiuntive

In DLLHUSK vengono illustrate anche le funzionalità seguenti:

  • Divisione di risorse per una singola applicazione in più file RC, che possono essere modificati nell'editor di risorse di Visual C++.

  • Utilizzo di due funzioni diagnostiche globali, AfxDoForAllClasses e AfxDoForAllObjects.

  • Enumerazione di oggetti CDynLinkLibrary.

Parole chiave

Nell'esempio vengono illustrate le seguenti parole chiave:

AfxDoForAllClasses; AfxDoForAllObjects; AfxGetApp; AfxGetResourceHandle; AfxMessageBox; AfxSetResourceHandle; AfxThrowMemoryException; CCmdUI::SetCheck; CColorDialog::DoModal; CColorDialog::GetColor; CDC::DrawText; CDC::SetBkColor; CDC::SetTextColor; CDialogBar::Create; CDocTemplate::GetDocString; CEditView::SerializeRaw; CFrameWnd::LoadFrame; CListBox::AddString; CListBox::Create; CListBox::GetCount; CListBox::GetText; CListBox::GetTextLen; CListBox::ResetContent; CListBox::SetCurSel; CMDIChildWnd::Create; CMenu::GetSubMenu; CMenu::LoadMenu; CMenu::TrackPopupMenu; CObject::AssertValid; CObject::Dump; CObject::Serialize; CStatusBar::Create; CStatusBar::SetIndicators; CToolBar::Create; 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

Nota:

Alcuni esempi, tra cui il presente, non sono stati cambiati per riflettere le modifiche apportate alle procedure guidate, alle librerie e al compilatore di Visual C++, tuttavia forniscono comunque le istruzioni per completare l'attività desiderata.

Vedere anche

Altre risorse

Esempi relativi ad MFC