DLL MFC normales liées de manière statique à MFC
Une DLL MFC standard liée de manière statique à MFC est une DLL qui utilise MFC en interne, et les fonctions exportées dans la DLL peuvent être appelées par des exécutables MFC ou non MFC. Comme le décrit le nom, ce type de DLL est généré à l’aide de la version de bibliothèque de liens statique de MFC. Les fonctions sont généralement exportées à partir d’une DLL MFC standard à l’aide de l’interface C standard. Pour obtenir un exemple d’écriture, de génération et d’utilisation d’une DLL MFC standard, consultez l’exemple DLLScreenCap.
Notez que le terme USRDLL n’est plus utilisé dans la documentation Visual C++. Une DLL MFC normale qui est liée statiquement à MFC a les mêmes caractéristiques que l’ancien USRDLL.
Une DLL MFC standard, liée statiquement à MFC, a les fonctionnalités suivantes :
L’exécutable client peut être écrit dans n’importe quel langage qui prend en charge l’utilisation de DLL (C, C++, Pascal, Visual Basic, etc.) ; il n’est pas obligé d’être une application MFC.
La DLL peut établir un lien vers les mêmes bibliothèques de liens statiques MFC utilisées par les applications. Il n’existe plus de version distincte des bibliothèques de liens statiques pour les DLL.
Avant la version 4.0 de MFC, les DLL USRDL fournissaient le même type de fonctionnalité que les DLL MFC standard liées statiquement à MFC. À partir de Visual C++ version 4.0, le terme USRDLL est obsolète.
Une DLL MFC standard, liée statiquement à MFC, a les exigences suivantes :
Ce type de DLL doit instancier une classe dérivée de
CWinApp
.Ce type de DLL utilise le
DllMain
modèle MFC fourni. Placez tout le code d’initialisation spécifique à la DLL dans laInitInstance
fonction membre et le code d’arrêt commeExitInstance
dans une application MFC normale.Même si le terme USRDLL est obsolète, vous devez toujours définir « _USRDLL » sur la ligne de commande du compilateur. Cette définition détermine les déclarations extraites des fichiers d’en-tête MFC.
Les DLL MFC standard doivent avoir une CWinApp
classe dérivée -et un seul objet de cette classe d’application, comme pour une application MFC. Toutefois, l’objet CWinApp
de la DLL n’a pas de pompe de message principale, comme l’objet CWinApp
d’une application.
Notez que le CWinApp::Run
mécanisme ne s’applique pas à une DLL, car l’application possède la pompe de message principale. Si la DLL ouvre des boîtes de dialogue sans mode ou dispose d’une fenêtre de trame principale, la pompe de messages principale de l’application doit appeler une routine exportée par la DLL qui appelle à son tour la CWinApp::PreTranslateMessage
fonction membre de l’objet d’application de la DLL.
Pour obtenir un exemple de cette fonction, consultez l’exemple DLLScreenCap.
Les symboles sont généralement exportés à partir d’une DLL MFC standard à l’aide de l’interface C standard. La déclaration d’une fonction exportée à partir d’une DLL MFC normale ressemble à ceci :
extern "C" __declspec(dllexport) MyExportedFunction( );
Toutes les allocations de mémoire au sein d’une DLL MFC normale doivent rester dans la DLL ; la DLL ne doit pas passer ou recevoir à partir de l’exécutable appelant l’un des éléments suivants :
Pointeurs vers des objets MFC
Pointeurs vers la mémoire allouée par MFC
Si vous devez effectuer l’une des opérations ci-dessus ou passer des objets dérivés de MFC entre l’exécutable appelant et la DLL, vous devez générer une DLL d’extension MFC.
Il est sûr de passer des pointeurs vers la mémoire qui ont été alloués par les bibliothèques d’exécution C entre une application et une DLL uniquement si vous effectuez une copie des données. Vous ne devez pas supprimer ou redimensionner ces pointeurs ni les utiliser sans effectuer une copie de la mémoire.
Une DLL liée statiquement à MFC ne peut pas également lier dynamiquement les DLL MFC partagées. Une DLL liée statiquement à MFC est liée dynamiquement à une application comme n’importe quelle autre DLL ; les applications y sont liées comme n’importe quelle autre DLL.
Les bibliothèques de liens statiques MFC standard sont nommées conformément à la convention décrite dans conventions d’affectation de noms pour les DLL MFC. Toutefois, avec MFC version 3.0 et ultérieure, il n’est plus nécessaire de spécifier manuellement à l’éditeur de liens la version de la bibliothèque MFC dans laquelle vous souhaitez être lié. Au lieu de cela, les fichiers d’en-tête MFC déterminent automatiquement la version correcte de la bibliothèque MFC à lier en fonction des définitions de préprocesseur, telles que _DEBUG ou _UNICODE. Les fichiers d’en-tête MFC ajoutent des directives /DEFAULTLIB demandant à l’éditeur de liens de lier dans une version spécifique de la bibliothèque MFC.