Freigeben über


TN011: Verwenden von MFC als Teil einer DLL

Dieser Hinweis wird auf reguläre DLLs, mit denen Sie die MFC-Bibliothek als Teil einer Windows-Dynamic Link Library (DLL) zu verwenden.Es wird davon ausgegangen, dass Sie mit Windows DLL vertraut sind und wie sie erstellt.Weitere Informationen über MFC-Erweiterungs-DLL, mit denen Sie Erweiterungen mit der MFC-Bibliothek erstellen können, finden Sie unter DLL-Version von MFC.

DLL-Schnittstellen

Reguläre DLL wird davon ausgegangen, dass Schnittstellen zwischen der Anwendung und DLL in C ähnlichen Funktionen oder in exportierten Klassen explizit angegeben werden.MFC-Klassen-Schnittstellen können nicht exportiert werden.

Wenn eine Anwendung und DLL MFC verwenden möchten, legen Sie eine Option entweder mit der freigegebene Version der MFC-Bibliotheken oder statisch mit einer Kopie der Bibliotheken verknüpfen.Die Anwendung und DLL beide verwenden möglicherweise eine der standardmäßigen Versionen der MFC-Bibliothek.

Reguläre DLL hat mehrere Vorteile:

  • Die Anwendung, die die DLL verwendet, muss MFC nicht verwenden und über eine Visual C++-Anwendung sein.

  • Arbeiten mit regulären DLL, die statisch mit MFC verknüpft sind, hängt die Größe der DLL nur von MFC und C-Ablauf ab, mit routinen und verknüpft werden.

  • Arbeiten mit regulärer DLLs, die dynamisch mit MFC verknüpft sind, kann die Speichern im Arbeitsspeicher von der Verwendung der gemeinsam genutzten MFC-Version von Bedeutung sein.Sie müssen jedoch die gemeinsam genutzten DLLs, die Kraftstoffregler <Version>.dll und das Msvvcrt <Version> DLL verteilen, mit der DLL.

  • Der DLL-Entwurf ist unabhängig davon, wie Klassen implementiert werden.Der DLL-Entwurf exportiert nur in der API.Wenn die Implementierung geändert wird, ist auf reguläre DLLs weiterhin gültig.

  • Arbeiten mit regulären DLL, die statisch mit MFC verknüpft sind, wenn MFC Anwendung und DLL verwenden, gibt es keine Probleme bei der Anwendung, die auf eine andere Version von MFC als DLL oder umgekehrt werden sollen.Da die MFC-Bibliothek statisch in jedes in EXE oder DLL verknüpft ist, gibt es keine Fragen darüber, welche Version Sie haben.

API-Einschränkungen

Einige MFC-Funktionalität gilt nicht für die DLL-Version, entweder aufgrund der technische Einschränkungen oder werden, da diese Dienste normalerweise von der Anwendung bereitgestellt werden.Mit der aktuellen Version von MFC ist die einzige Funktion, die nicht anwendbar ist, CWinApp::SetDialogBkColor.

Erstellen der DLL

Wenn muss das Kompilieren der regulären DLL, die statisch mit MFC verknüpfte auf Symbole _USRDLL und _WINDLL verknüpfen, definiert sind.Der DLL-Code muss mit den folgenden Compilerschaltern ebenfalls kompiliert werden:

  • /D_WINDLL gibt die Kompilierung ist für eine DLL

  • Erstellen Sie /D_USRDLL gibt eine reguläre DLL an

Sie müssen diese Symbole definieren und diese Compilerschalter verwenden, wenn Sie reguläre DLL kompilieren, die dynamisch mit MFC verknüpft sind.Außerdem muss das Symbol _AFXDLL definiert werden und der DLL-Code muss mit kompiliert werden:

  • /D_AFXDLL gibt an, dass Sie eine reguläre DLL erstellen, die dynamisch mit MFC verknüpft wird

Die Schnittstellen (APIs) zwischen der Anwendung und dem DLLs müssen explizit exportiert werden.Es wird empfohlen, dass Sie die Schnittstellen definieren, um die Bandbreite zu sein, und C-Schnittstellen nur verwenden, wenn Sie können.Direkte C-Schnittstellen als komplexere C++-Klassen sind einfacher zu warten.

Platzieren Sie das APIs in einem separaten Header, der von C# und C++ Files aufgenommen werden kann.Weitere Informationen finden Sie, dass der Header ScreenCap.h in MFC Konzept Beispiel finden Sie ein Beispiel DLLScreenCap verschoben wurde.Um die Funktionen zu exportieren, geben Sie sie im EXPORTS-Abschnitt der Moduldefinitionsdatei (.DEF) ein, oder fügen Sie __declspec(dllexport) auf den Funktionsdefinitionen ein.Verwenden Sie __declspec(dllimport), um diese Features in die ausführbare Client zu importieren.

Sie müssen das AFX_MANAGE_STATE Makros zu Beginn aller exportierten Funktionen in der regulären DLL hinzufügen, die dynamisch mit MFC verknüpft sind.Dieses Makro wird der als aktuellen Modulzustand die DLL fest.Um dieses Makro verwenden, fügen Sie die folgende Codezeile am Anfang von Funktionen hinzu, die aus der DLL exportiert werden:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

WinMain - &gt; DllMain

Die MFC-Bibliothek definiert die Win32- Standard-Einstiegspunkt DllMain, der das abgeleitetes Objekt wie bei einer normalen MFC-Anwendung CWinApp initialisiert.Fügen Sie alle DLL-Besondere Initialisierung in der InitInstance wie bei einer normalen MFC-Anwendung Methode.

Beachten Sie, dass der CWinApp::Run-Mechanismus nicht auf eine DLL angewendet werden kann, da die Haupt-Meldungsverteilschleife im Besitz der Anwendung ist.Wenn die DLL nicht modale Dialogfelder anzeigt oder einen eigenen Hauptrahmenfenster hat, muss die Haupt-Meldungsverteilschleife der Anwendung eine DLL-exportierte Routine aufrufen, die CWinApp::PreTranslateMessage aufruft.

Zeigen Sie das DLLScreenCap-Beispiel für die Verwendung dieser Funktion.

Die DllMain-Funktion, die MFC bereitgestellt wird, ruft die CWinApp::ExitInstance-Methode einer Klasse veranschaulicht, die von CWinApp abgeleitet ist, bevor die DLL entladen wird.

Ihre DLL verknüpfen

Arbeiten mit regulären DLL, die statisch mit MFC verknüpft sind, müssen Sie die DLL mit Nafxcwd.lib oder Nafxcw.lib und mit der Version der C-Laufzeiten verknüpfen, die Libcmt.lib benannt werden.Diese Bibliotheken sind vordefiniert und installiert werden, indem sie angeben, wenn Sie Visual C++-Setup ausführen.

Beispielcode

Weitere Informationen finden Sie, dass das Konzept von MFC beispielprogramm DLLScreenCap für vollständiges Beispiel für erweiterte.Einige interessante in diesem Beispiel Punkte zu beachten sind:

  • Der Compiler Flags der DLL und der Anwendung unterschiedlich sind.

  • Die Namen von Zeilen und DEF-Dateien für die DLL und die für die Anwendung unterschiedlich sind.

  • Die Anwendung, die die DLL verwendet, muss nicht in C++ sein.

  • Die Schnittstelle zwischen der Anwendung und DLL ist eine API, die in C oder C++ verwendet werden kann und mit DLLScreenCap.def exportiert wird.

Im folgenden Beispiel wird eine API, die in einer regulären DLL definiert ist, die statisch mit MFC verknüpft.In diesem Beispiel wird die Deklaration in einem extern "C" { }-Block für C++-Benutzer eingeschlossen.Dies bietet mehrere Vorteile.Zuerst wird die DLL APIs von non-C++ Clientanwendungen verwendet werden.Zweitens reduziert, da es DLL-Mehraufwand C++-Namensergänzung nicht in den exportierten Namen angewendet wird.Abschließend macht es einfacher, eine DEF-Datei (zum Exportieren nach Ordnungszahl) ohne Namensergänzung hinzuzufügen, um explizit bereitgestellt werden soll.

#ifdef __cplusplus
extern "C" {
#endif  /* __cplusplus */

struct TracerData
{
    BOOL    bEnabled;
    UINT    flags;
};

BOOL PromptTraceFlags(TracerData FAR* lpData);

#ifdef __cplusplus
}
#endif

Die Strukturen, die von der API verwendet werden, sind nicht von MFC-Klassen abgeleitet und werden im API-Header definiert.Dies reduziert die Komplexität der Schnittstelle zwischen der DLL und der Anwendung verwendet werden, wodurch die DLL für C-Programme.

Siehe auch

Weitere Ressourcen

Technische Hinweise durch Zahl

Technische Hinweise nach Kategorie