Reguläre, statisch mit MFC verknüpfte MFC-DLLs
Eine reguläre, statisch mit MFC verknüpfte DLL verwendet MFC intern, und die exportierten Funktionen in der DLL können entweder von ausführbaren MFC- oder Nicht-MFC-Dateien aufgerufen werden. Wie der Name schon sagt, wird diese Art von DLL mithilfe der statischen Verknüpfungsbibliotheksversion von MFC erstellt. Funktionen werden in der Regel mithilfe der Standard-C-Schnittstelle aus einer regulären MFC-DLL exportiert. Ein Beispiel zum Schreiben, Erstellen und Verwenden einer regulären MFC-DLL finden Sie unter DLLScreenCap.
Beachten Sie, dass der Begriff USRDLL in der Visual C++-Dokumentation nicht mehr verwendet wird. Eine reguläre, statisch mit MFC verknüpfte DLL weist dieselben Merkmale wie die frühere USRDLL auf.
Eine reguläre, statisch mit MFC verknüpfte DLL verfügt über folgende Funktionen:
Die ausführbare Clientdatei kann in jeder Programmiersprache geschrieben sein, die die Verwendung von DLLs unterstützt (C, C++, Pascal, Visual Basic usw.). Es muss sich nicht um eine MFC-Anwendung handeln.
Die DLL kann mit den gleichen statisch mit MFC verknüpften Bibliotheken verknüpft werden, die von Anwendungen verwendet werden. Es gibt keine separate Version der statischen Verknüpfungsbibliotheken für DLLs mehr.
Vor Version 4.0 von MFC stellten USRDLLs den gleichen Typ von Funktionen bereit wie reguläre, statisch mit MFC verknüpfte MFC-DLLs. Ab Version 4.0 von Visual C++ gilt der Begriff USRDLL als veraltet.
Für eine reguläre, statisch mit MFC verknüpfte DLL gelten folgende Anforderungen:
Dieser DLL-Typ muss eine von
CWinApp
abgeleitete Klasse instanziieren.Diese Art von DLL verwendet die von MFC bereitgestellte
DllMain
-Funktion. Platzieren Sie den gesamten DLL-spezifischen Initialisierungscode wie in einer normalen MFC-Anwendung in der MemberfunktionInitInstance
und den Terminierungscode inExitInstance
.Obwohl der Begriff USRDLL veraltet ist, müssen Sie _USRDLL in der Befehlszeile des Compilers definieren. Diese Definition bestimmt, welche Deklarationen von den MFC-Headerdateien abgerufen werden.
Reguläre MFC-DLLs müssen wie eine MFC-Anwendung über eine von CWinApp
abgeleitete Klasse und ein einzelnes Objekt dieser Anwendungsklasse verfügen. Das CWinApp
-Objekt der DLL muss jedoch nicht wie das CWinApp
-Objekt einer Anwendung über ein Hauptnachrichtensystem verfügen.
Beachten Sie, dass der CWinApp::Run
-Mechanismus nicht für eine DLL gilt, da die Anwendung das Hauptnachrichtensystem besitzt. Wenn die DLL Dialogfelder ohne Modus öffnet oder über ein eigenes Hauptrahmenfenster verfügt, muss das Hauptnachrichtensystem der Anwendung eine von der DLL exportierte Routine aufrufen, die wiederum die CWinApp::PreTranslateMessage
-Memberfunktion des Anwendungsobjekts der DLL aufruft.
Ein Beispiel dieser Funktion finden Sie im Beispiel „DLLScreenCap“.
Symbole werden in der Regel mithilfe der Standard-C-Schnittstelle aus einer regulären MFC-DLL exportiert. Die Deklaration einer aus einer regulären MFC-DLL exportierten Funktion würde in etwa wie folgt aussehen:
extern "C" __declspec(dllexport) MyExportedFunction( );
Alle Speicherbelegungen innerhalb einer regulären MFC-DLL sollten innerhalb der DLL bleiben. Die DLL sollte Folgendes nicht an die aufrufende ausführbare Datei übergeben oder von dieser empfangen:
Zeiger auf MFC-Objekte
Zeiger auf durch MFC belegten Speicher
Wenn Sie eine der oben genannten Aktionen durchführen oder von MFC abgeleitete Objekte zwischen der aufrufenden ausführbaren Datei und der DLL übergeben müssen, müssen Sie eine MFC-Erweiterungs-DLL erstellen.
Es ist nur sicher, Zeiger auf Speicher zu übergeben, die von den C-Laufzeitbibliotheken zwischen einer Anwendung und einer DLL zugeordnet wurden, wenn Sie eine Kopie der Daten erstellen. Sie dürfen diese Zeiger nicht löschen, deren Größe nicht ändern und sie nicht verwenden, ohne eine Kopie des Speichers zu erstellen.
Eine DLL, die statisch mit MFC verknüpft ist, kann nicht auch dynamisch mit den gemeinsam genutzten MFC-DLLs verknüpft sein. Eine DLL, die statisch mit MFC verknüpft ist, ist wie jede andere DLL dynamisch an eine Anwendung gebunden. Anwendungen verknüpfen sich mit dieser DLL wie mit jeder anderen DLL.
Die MFC-Standardbibliotheken für statische Verknüpfungen werden entsprechend der unter Namenskonventionen für MFC-DLLs beschriebenen Konvention benannt. Bei Version 3.0 und späteren Versionen von MFC müssen Sie dem Linker jedoch nicht mehr selbst die Version der MFC-Bibliothek angeben, in der Sie eine Verknüpfung wünschen. Stattdessen bestimmen die MFC-Headerdateien automatisch die richtige Version der MFC-Bibliothek, die basierend auf Präprozessoren definiert wird, z . B. _DEBUG oder _UNICODE. Die MFC-Headerdateien fügen „/DEFAULTLIB“-Anweisungen hinzu, die den Linker anweisen, in einer bestimmten Version der MFC-Bibliothek zu verknüpfen.