TN011: À l'aide de MFC dans le cadre d'une DLL

Cette note décrit les DLL normales, qui vous permettent d'utiliser la bibliothèque MFC dans le cadre d'une bibliothèque de liens dynamiques Windows (DLL). Il suppose que vous êtes familiarisé avec Windows DLL et comment les créer. Pour plus d'informations sur qui vous permettent de créer des extensions à la bibliothèque MFC, les DLL d'extension MFC, consultez Version DLL de MFC.

Interfaces DLL

DLL normales liées de supposent des interfaces entre l'application et la DLL sont spécifiés dans la normales c comme fonctions ou classes exportées explicitement. Les interfaces de classe MFC ne peut pas être exportés.

Si une DLL et une application utiliser MFC, les deux ont le choix d'utiliser la version partagée des bibliothèques MFC ou avoir une copie de la bibliothèque MFC liée de manière statique dans les. Dans les versions antérieures à Visual C++ 4.0, les bibliothèques de liaisons statiques de MFC étaient différentes pour les applications et les dll. Avec la version actuelle de MFC, l'application et la DLL peuvent tous les deux utilisent une des versions standards de la bibliothèque MFC. Il n'est pas une bibliothèque distincte pour les dll dans cette version (MFC rend le choix lors de l'exécution).

DLL normales ont plusieurs avantages:

Limitations de l'API

Certaines fonctionnalités MFC ne sont pas applicables à la version de la DLL, soit en raison de limitations techniques ou parce que ces services sont généralement fournis par l'application. Ces limites sont indiquées ci-dessous:

Construction de votre DLL

Lors de la compilation les DLL normales liées de manière statique aux MFC, les symboles "_USRDLL" et "_WINDLL" doivent être définis. Votre code de la DLL doit également être compilée avec les commutateurs du compilateur suivante:

Lors de la compilation dll dynamiquement aux MFC, vous devez définir les symboles ci-dessus et utiliser les commutateurs du compilateur ci-dessus. Apporte, le symbole «_AFXDLL» doit être défini et votre code de la DLL doit être compilée avec:

Les interfaces (API) entre l'application et la DLL doivent être explicitement exportés. Il est recommandé que vous définissiez vos interfaces à faible bande passante, s'en tenir aux interfaces c lorsque cela est possible. Interfaces c plus directes sont plus faciles à maintenir que les classes C++ plus complexes.

Placez votre API dans un en-tête séparé qui peut être inclus par les c et C++ fichiers (de cette façon vous ne limitez vos clients DLL aux programmeurs en C++). Voir l'en-tête TRACEAPI.H dans l'exemple MFC Advanced Concepts DLLTRACE pour un exemple. Pour exporter vos fonctions, entrer dans la section EXPORTS de votre fichier de définition de module (.DEF) ou __declspec (dllexport) sur votre définition de fonction. Utiliser __declspec (dllimport) pour importer ces fonctions dans l'exécutable client.

Vous devez ajouter la macro AFX_MANAGE_STATE au début de toutes les fonctions exportées de la DLL dynamiquement aux MFC pour définir l'état actuel du module à celui de la DLL. Cela se fait en ajoutant la ligne suivante de code au début des fonctions exportées de la DLL:

nbsp; & nbsp;

AFX_MANAGE_STATE (partir de AfxGetStaticModuleState ())

nbsp; & nbsp;

WinMain - > ; DllMain

La bibliothèque MFC définit le point d'entrée standard Win32 DllMain qui initialise votre objet dérivé de CWinApp comme dans une application MFC normale. Placer toute initialisation de DLL spécifiques dans la fonction membre InitInstance comme dans une application MFC normale.

Notez que le mécanisme de CWinApp::Run ne s'applique pas à une DLL, car l'application est propriétaire de la pompe de messages principale. Si votre DLL apporte des boîtes de dialogue non modales ou possède une fenêtre frame principale propre, la pompe de messages principale de votre application doit appeler une routine de DLL exportée qui appelle CWinApp::PreTranslateMessage.

Consultez l'exemple DLLTRACE pour utiliser cette fonction.

La fonction de membre de ExitInstance de CWinApp de votre classe dérivée sera appelée à partir du MFC fournis la fonction DllMain avant la DLL est déchargée.

Quoi faire pour relier toutes les

Avec les DLL normales liées statiquement aux MFC, vous devez lier votre DLL avec cette bibliothèque (NAFXCWD.LIB ou NAFXCW.LIB) avec la version de la runtimes c appelé « LIBCMT.LIB'. Ces bibliothèques sont prédéfinis et peuvent être installés en spécifiant leur lorsque vous exécutez le programme d'installation de Visual C++.

Exemples de Code

Veuillez voir l'exemple de programme MFC Advanced Concepts DLLTRACE pour obtenir un exemple complet. Cela inclut une DLL simple appelée « traceur.DLL' qui met en œuvre les drapeaux AFX Trace de dialogue (voir technique Note 7). Elle a aussi une application HELLO simple qui appelle la DLL pour utiliser la boîte de dialogue.

Plusieurs chose intéressante à noter:

L'extrait suivant de TRACEAPI.H illustre ce qui est nécessaire à une API qui est définie dans une DLL normale liée statiquement aux MFC:

# ifdef __cplusplus
extern « C » {
#endifnbsp ; / * __cplusplus * /

struct TracerData
{
    BOOL bEnabled ;
    UI&NT flags ;
};

BOOL loin PASCAL EXPORT PromptTraceFlags (TracerData FAR * lpData) ;

# ifdef __cplusplus
}
# endif

Dans cet exemple, la déclaration est enfermée dans un bloc 'extern "C"}' pour les utilisateurs de C++. Cela comporte plusieurs avantages. Tout d'abord, il est votre API DLL utilisable par les applications clientes non-C++. Deuxièmement, elle réduit frais généraux DLL puisque la composition des noms C++ ne sera pas appliquée le nom exporté. Enfin, il est plus facile d'ajouter explicitement à un.DEF sans avoir à vous soucier de composition des noms de fichiers (pour l'exportation par ordinal).

Toutes les fonctions de l'API sont «Loin PASCAL EXPORT». Bien que pas strictement nécessaire pour les DLL Win32, ces définitions ont été gardées pour dos-Portage facile pour Windows 16 bits. Les macros FAR, PASCALet d'exporter toutes les étendre à rien sous Win32.

Les structures utilisées par l'API ne sont pas dérivées de classes MFC et sont complètement définis dans l'en-tête de l'API. Cela réduit la complexité de l'interface entre la DLL et l'application et, encore une fois, rend la DLL utilisable par des programmes c ainsi.

Les pointeurs de données utilisées dans l'API sont des pointeurs FAR explicites. Encore une fois, l' extrême, n'est pas vraiment nécessaire pour Win32, mais est utile si vous souhaitez compiler le code pour Windows 16 bits dans un avenir.

&Notes techniques par le numéro |nbsp ; Notes techniques par catégorie

Index