DLLHUSK-Beispiel: Dynamisch verknüpft die MFC-Bibliothek

DLLHUSK-Beispiel verknüpft dynamisch die MFC-Bibliothek für Anwendungen und benutzerdefinierte Dynamic Link Libraries (DLL) gemeinsam denselben-Klasse Bibliothek Code daher verringert den insgesamt erforderlichen Speicher um mehrere Anwendungen ausgeführt werden.

Dynamische Verknüpfung mit MFC bietet auch andere mögliche Anwendungsarchitekturen, in denen Teil der Anwendung in eine benutzerdefinierte DLL und der Anwendung und der benutzerdefinierten DLL-Freigabe der MFC-DLL (MFCxx.dll) implementiert ist. Eine benutzerdefinierte DLL, die Framework-Funktionalität mit einer Anwendung teilt wird eine MFC-Erweiterungs-DLL aufgerufen.

SicherheitshinweisSicherheitshinweis

Dieser Beispielcode soll ein Konzept veranschaulichen, und es wird nur den Code, der für dieses Konzept relevant sind. Möglicherweise erfüllt dieser nicht die Sicherheitsanforderungen für eine bestimmte Umgebung, und er sollte nicht genau wie dargestellt verwendet werden. Wir empfehlen, Sicherheits- und Fehlerbehandlungscode hinzuzufügen, um Ihre Projekte sicherer und stabiler zu machen. Microsoft stellt diesen Beispielcode "Wie besehen"keine Garantien.

So erhalten Sie Beispiele und Anweisungen für deren Installation:

Um Beispiele von Visual Studio zuzugreifen

  • im Menü Hilfe Menü klicken Beispiele.

    Standardmäßig sind die Beispiele in installiert. Laufwerk: \Programme\Microsoft visual Studio 10.0\Samples\.

  • Die neueste Version dieses Beispiels und eine Liste der anderen Beispiele finden Sie unter Visual Studio Samples auf der MSDN-Website.

Erstellen und Ausführen des Beispiels

So erstellen Sie und führen DLLHUSK-Beispiel

  1. Öffnen Sie die Projektmappe dllhusk.sln.

  2. erstellen Sie Menü, klicken Sie auf erstellen.

  3. Debuggen Sie auf Menü, klicken Sie auf Starten ohne Debuggen.

Die Projektmappe DLLHUSK erstellt die Anwendung DLLHUSK.exe und die beiden DLLs (TESTDLL1.dll und TESTDLL2.dll), mit denen die Anwendung dynamisch verknüpft ist. DLLHUSK benötigt MFCxx.DLL oder MFCxxD.DLL zur Laufzeit. Diese DLLs werden standardmäßig in Windows-Systemverzeichnis installiert.

DLLHUSK MFC-DLLs

DLLHUSK veranschaulicht MFC-Erweiterungs-DLLs mit Klasse exportiert. C++-Klassen in den DLLs (TESTDLL1.dll und TESTDLL2.dll) werden mithilfe des Makros AFX_EXT_CLASS exportiert. Die ersten MFC-Erweiterungs-DLL (TESTDLL1) ist in der alle C++-Klassenschnittstellen der benutzerdefinierten DLL nur durch das Framework nicht direkt von der Anwendung zugegriffen werden. Die benutzerdefinierte DLL exportiert nur extern "C"Funktionen der Anwendung. Die benutzerdefinierte DLL muss nicht die Funktionen von Framework-Klassen abgeleitete Klassen exportieren. Alle Aufrufe vom Framework an abgeleitete Klassen in der benutzerdefinierten DLL werden über die C++-Mechanismus virtuelle Funktion aufgelöst.

Der zweite ist MFC-Erweiterungs-DLL (TESTDLL2) in dem einige C++-Klassenschnittstellen der benutzerdefinierten DLL exportiert und auf die direkt von der Anwendung zugegriffen wird.

TESTDLL1.dll

TESTDLL1.dll stellt die Implementierung für DLLHUSK Dokument- und Ansichtsklassen für beide Typen dokumentieren, die TEXT-Dokumenttyp und der HELLO-Dokumenttyp. Die DLLHUSK.exe implementiert die MDI-Rahmenfensterklasse, und das Framework implementiert die mehrere Dokument Interface (MDI) untergeordnete Fensterklasse (CMDIChildWnd). Zwei Vorlage Dokumentobjekte richten die Zuordnungen zwischen CTextDocCMDIChildWndund CEditView sowie zwischen CDummyDocCMDIChildWndund CHelloView. DLLHUSK veranschaulicht daher, dass das Framework die Beziehungen zwischen Framework definierten Objekten koordinieren kann, jedoch die Klassen für diese Objekte sind selbst implementiert in der Anwendung die benutzerdefinierten (MFC-Erweiterungs-) DLL und MFCxx.DLL des Frameworks.

TESTDLL1 ruft tatsächlich das Anwendungsobjekt AddDocTemplate Memberfunktion zweimal, um die zwei Dokument Vorlage Objekte zu registrieren. Dies geschieht in der Implementierung des TESTDLL1 InitTestDLL1 Funktion, die die einzige Funktion ist, die TESTDLL1. Diese Funktion wird mit extern "C" deklariert werden.sodass die DLLHUSK-Anwendung als eigenständige C-Funktion aufrufen kann.

Die TESTDLL1.h-Headerdatei (hinzugefügt als #include durch DLLHUSK.cpp) beinhaltet nicht nur die Deklaration von InitTestDLL1,, sondern auch die Deklarationen der TESTDLL1 Klassen. DLLHUSK.cpp bezieht sich direkt auf nur die Funktion InitTestDLL1. Indirekt, verwendet jedoch DLLHUSK das Dokument und Ansicht in TESTDLL1.dll Klassen implementiert.

TESTDLL2.dll

Testdll2.dll stellt die Implementierung für DLLHUSK CListOutputFrame Klasse bereit. Wenn der Benutzer einen mithilfe des Kontextmenüs Diagnosebefehl, die Anwendung erstellt ein Objekt CListOutputFrame und sendet anschließend durch Aufrufen von CListOutputFrame::AddString Diagnosemeldungen im Ausgabefenster Liste.

All public member functions ofCListOutputFrame are exported in the Testdll2.def file. Der Export beinhaltet nicht nur AddString , aber auch die öffentlichen CListOutputFrame-Konstruktor und Destruktor.

Es ist schwieriger, eine MFC-Erweiterungs-DLL, die Memberfunktionen der Klasse als exportiert implementieren, die nur C-Funktionen exportiert. Dies gilt besonders, da Sie die Exporte, C++ die ergänzten Namen-Funktion manuell DEF-Datei der DLL hinzufügen müssen. Eine Technik zum Vorgang wird so in Technischer Hinweis 33 erläutert.

Weitere DLLHUSK-Features

DLLHUSK veranschaulicht darüber hinaus:

  • Aufteilen von Ressourcen für eine einzelne Anwendung in mehrere RC-Dateien, die in Visual C++-Ressourcen-Editor bearbeitet werden können.

  • Verwenden von zwei globalen Diagnosefunktionen, AfxDoForAllClasses und AfxDoForAllObjects.

  • CDynLinkLibrary Objekte werden aufgelistet.

Schlüsselwörter

Dieses Beispiel demonstriert die Verwendung der folgenden Schlüsselwörter:

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

Hinweis

Einige Beispiele, z. B. eine, wurden nicht geändert, um Änderungen in der Visual C++-Assistenten, Bibliotheken und Compiler, demonstrieren aber dennoch wie Sie die gewünschte Aufgabe durchführen.

Siehe auch

Weitere Ressourcen

MFC-Beispiele