DLL MFC normales liées de manière dynamique à MFC
Une DLL MFC régulière liée dynamiquement à 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 créé à l’aide de la version de bibliothèque de liens dynamiques de MFC (également appelée version partagée de MFC). Les fonctions sont généralement exportées à partir d’une DLL MFC standard à l’aide de l’interface C standard.
Vous devez ajouter la AFX_MANAGE_STATE
macro au début de toutes les fonctions exportées dans des DLL MFC régulières qui relient dynamiquement MFC pour définir l’état du module actuel sur celui de la DLL. Pour ce faire, ajoutez la ligne de code suivante au début des fonctions exportées à partir de la DLL :
AFX_MANAGE_STATE(AfxGetStaticModuleState( ))
Une DLL MFC standard, liée dynamiquement à MFC, a les fonctionnalités suivantes :
Il s’agit d’un nouveau type de DLL introduit par Visual C++ 4.0.
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.
Contrairement à la DLL MFC régulière liée statiquement, ce type de DLL est lié dynamiquement à la DLL MFC (également appelée DLL MFC partagée).
La bibliothèque d’importation MFC liée à ce type de DLL est la même que celle utilisée pour les DLL d’extension MFC ou les applications à l’aide de la DLL MFC : MFCxx(D).lib.
Une DLL MFC standard, liée dynamiquement à MFC, a les exigences suivantes :
Ces DLL sont compilées avec _AFXDLL définies, tout comme un exécutable lié dynamiquement à la DLL MFC. Mais _USRDLL est également défini, tout comme une DLL MFC normale liée statiquement à MFC.
Ce type de DLL doit instancier une
CWinApp
classe dérivée de -.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.
Étant donné que ce type de DLL utilise la version de la bibliothèque de liens dynamiques de MFC, vous devez définir explicitement l’état du module actuel sur celui de la DLL. Pour ce faire, utilisez la macro AFX_MANAGE_STATE au début de chaque fonction exportée à partir de la DLL.
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 votre DLL affiche des dialogues sans mode ou dispose d’une fenêtre de trame principale de sa propre machine, la pompe de messages principale de votre application doit appeler une routine exportée par DLL qui appelle CWinApp::PreTranslateMessage
.
Placez l’initialisation spécifique à la DLL dans la CWinApp::InitInstance
fonction membre comme dans une application MFC normale. La CWinApp::ExitInstance
fonction membre de votre CWinApp
classe dérivée est appelée à partir de la fonction fournie DllMain
par MFC avant que la DLL ne soit déchargée.
Vous devez distribuer les DLL partagées MFCx0.dll et Msvcr*0.dll (ou fichiers similaires) avec votre application.
Une DLL liée dynamiquement à MFC ne peut pas également être liée statiquement à MFC. Les applications se lient à des DLL MFC régulières liées dynamiquement à MFC, comme n’importe quelle autre DLL.
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 si vous devez 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.
Lors de la génération d’une DLL MFC standard qui lie dynamiquement MFC, vous devez utiliser la macro AFX_MANAGE_STATE pour changer l’état du module MFC correctement. Pour ce faire, ajoutez la ligne de code suivante au début des fonctions exportées à partir de la DLL :
AFX_MANAGE_STATE(AfxGetStaticModuleState( ))
La macro AFX_MANAGE_STATE ne doit pas être utilisée dans les DLL MFC standard qui sont liées statiquement à MFC ou dans les DLL d’extension MFC. Pour plus d’informations, consultez Gestion des données d’état des modules MFC.
Pour obtenir un exemple d’écriture, de génération et d’utilisation d’une DLL MFC standard, consultez l’exemple DLLScreenCap. Pour plus d’informations sur les DLL MFC standard qui relient dynamiquement MFC à MFC, consultez la section intitulée « Conversion de DLLScreenCap en liaison dynamique avec la DLL MFC » dans l’extrait de l’exemple.