Macros et fonctions pour la gestion des DLL
Nom | Description |
---|---|
AFX_EXT_CLASS ] |
Exporte des classes. |
AFX_MANAGE_STATE |
Protégez une fonction exportée dans une DLL. |
AfxOleInitModule |
Fournit une prise en charge OLE à partir d’une DLL MFC standard liée dynamiquement à MFC. |
AfxNetInitModule |
Fournit la prise en charge des sockets MFC à partir d’une DLL MFC standard liée dynamiquement à MFC. |
AfxGetAmbientActCtx |
Obtient l’état actuel de l’indicateur d’état par module. |
AfxGetStaticModuleState |
Définit l’état du module avant l’initialisation et restaure l’état du module précédent après le nettoyage. |
AfxInitExtensionModule |
Initialise la DLL. |
AfxSetAmbientActCtx |
définissez l’indicateur d’état par module, qui affecte le comportement WinSxS de MFC. |
AfxTermExtensionModule |
Permet à MFC de nettoyer la DLL d’extension MFC lorsque chaque processus se détache de la DLL. |
AFX_EXT_CLASS
Les DLL d’extension MFC utilisent la macro AFX_EXT_CLASS
pour exporter des classes ; les exécutables qui lient à la DLL d’extension MFC utilisent la macro pour importer des classes.
Notes
Avec la AFX_EXT_CLASS
macro, le ou les mêmes fichiers d’en-tête utilisés pour générer la DLL d’extension MFC peuvent être utilisés avec les exécutables liés à la DLL.
Dans le fichier d’en-tête de votre DLL, ajoutez le AFX_EXT_CLASS
mot clé à la déclaration de votre classe comme suit :
class AFX_EXT_CLASS CMyClass : public CDocument
{
// <body of class>
};
Pour plus d’informations, consultez Exporter et importer à l’aide AFX_EXT_CLASS
de .
Spécifications
Header :<afxv_dll.h>
AFX_MANAGE_STATE
Appelez cette macro pour protéger une fonction exportée dans une DLL.
Syntaxe
AFX_MANAGE_STATE(AFX_MODULE_STATE* pModuleState )
Paramètres
pModuleState
Pointeur vers une AFX_MODULE_STATE
structure.
Notes
Lorsque cette macro est appelée, pModuleState
est l’état du module effectif pour le reste de l’étendue contenante immédiatement. Lors de la sortie de l’étendue, l’état du module effectif précédent est automatiquement restauré.
La AFX_MODULE_STATE
structure contient des données globales pour le module, c’est-à-dire la partie de l’état du module qui est envoyé ou dépilé.
Par défaut, MFC utilise le handle de ressource d'application principale pour charger le modèle de ressources. Si vous avez une fonction exportée dans une DLL, par exemple une boîte de dialogue qui lance une boîte de dialogue dans la DLL, le modèle de ressource est stocké dans le module DLL. Veillez à changer l’état du module pour que le handle approprié soit utilisé. Vous pouvez changer l’état en ajoutant le code suivant au début de la fonction :
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
Cette macro échange l’état actuel du module avec l’état retourné jusqu’à AfxGetStaticModuleState
la fin de l’étendue actuelle.
Pour plus d’informations sur les états de module et MFC, consultez Gestion des données d’état des modules MFC et de la note technique 58.
Remarque
Lorsque MFC crée un contexte d’activation pour un assembly, il utilise AfxWinInit
pour créer le contexte et AFX_MANAGE_STATE
l’activer et le désactiver. Notez également qu’il AFX_MANAGE_STATE
est activé pour les bibliothèques MFC statiques, ainsi que les DLL MFC, afin d’autoriser l’exécution du code MFC dans le contexte d’activation approprié sélectionné par la DLL utilisateur. Pour plus d’informations, consultez Prise en charge des contextes d’activation dans l’état du module MFC.
Spécifications
Header :<afxstat_.h>
AfxOleInitModule
Pour prendre en charge OLE à partir d’une DLL MFC standard liée dynamiquement à MFC, appelez cette fonction dans la fonction de la CWinApp::InitInstance
DLL MFC normale pour initialiser la DLL OLE MFC.
Syntaxe
void AFXAPI AfxOleInitModule( );
Notes
La DLL OLE MFC est une DLL d’extension MFC ; pour qu’une DLL d’extension MFC soit câblée dans une CDynLinkLibrary
chaîne, elle doit créer un CDynLinkLibrary
objet dans le contexte de chaque module qui l’utilisera. AfxOleInitModule
crée l’objet dans le CDynLinkLibrary
contexte de la DLL MFC standard afin qu’il soit câblé dans la chaîne d’objets de la CDynLinkLibrary
DLL MFC standard.
Si vous créez un contrôle OLE et que vous utilisez COleControlModule
, vous ne devez pas appeler AfxOleInitModule
car la InitInstance
fonction membre pour COleControlModule
les appels AfxOleInitModule
.
Spécifications
En-tête : <afxdll_.h>
AfxNetInitModule
Pour la prise en charge des sockets MFC à partir d’une DLL MFC standard liée dynamiquement à MFC, ajoutez un appel à cette fonction dans la fonction de CWinApp::InitInstance
votre DLL MFC standard pour initialiser la DLL de sockets MFC.
Syntaxe
void AFXAPI AfxNetInitModule( );
Notes
La DLL de sockets MFC est une DLL d’extension MFC ; pour qu’une DLL d’extension MFC soit câblée dans une CDynLinkLibrary
chaîne, elle doit créer un CDynLinkLibrary
objet dans le contexte de chaque module qui l’utilisera. AfxNetInitModule
crée l’objet dans le CDynLinkLibrary
contexte de la DLL MFC standard afin qu’il soit câblé dans la chaîne d’objets de la CDynLinkLibrary
DLL MFC standard.
Spécifications
Header :<afxdll_.h>
AfxGetAmbientActCtx
Utilisez cette fonction pour obtenir l’état actuel de l’indicateur d’état par module, ce qui affecte le comportement WinSxS de MFC.
Syntaxe
BOOL AFXAPI AfxGetAmbientActCtx();
Valeur de retour
Valeur actuelle de l’indicateur d’état du module.
Notes
Lorsque l’indicateur est défini (qui est la valeur par défaut) et qu’un thread entre dans un module MFC (voir AFX_MANAGE_STATE
), le contexte du module est activé.
Si l’indicateur n’est pas défini, le contexte du module n’est pas activé lors de l’entrée.
Le contexte d’un module est déterminé à partir de son manifeste, souvent incorporé dans les ressources de module.
Spécifications
Header :<afxcomctl32.h>
AfxGetStaticModuleState
Appelez cette fonction pour définir l’état du module avant l’initialisation et restaurer l’état du module précédent après le nettoyage.
Syntaxe
AFX_MODULE_STATE* AFXAPI AfxGetStaticModuleState( );
Valeur de retour
Pointeur vers une AFX_MODULE_STATE
structure.
Notes
La AFX_MODULE_STATE
structure contient des données globales pour le module, c’est-à-dire la partie de l’état du module qui est envoyé ou dépilé.
Par défaut, MFC utilise le handle de ressource d'application principale pour charger le modèle de ressources. Si vous avez une fonction exportée dans une DLL, par exemple une boîte de dialogue qui lance une boîte de dialogue dans la DLL, le modèle de ressource est stocké dans le module DLL. Veillez à changer l’état du module pour que le handle approprié soit utilisé. Vous pouvez changer l’état en ajoutant le code suivant au début de la fonction :
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
Cette macro échange l’état actuel du module avec l’état retourné jusqu’à AfxGetStaticModuleState
la fin de l’étendue actuelle.
Pour plus d’informations sur les états de module et MFC, consultez Gestion des données d’état des modules MFC et de la note technique 58.
Spécifications
Header :<afxstat_.h>
AfxInitExtensionModule
Appelez cette fonction dans une DLL d’extension DllMain
MFC pour initialiser la DLL.
Syntaxe
BOOL AFXAPI AfxInitExtensionModule( AFX_EXTENSION_MODULE& state, HMODULE hModule );
Paramètres
state
Référence à la AFX_EXTENSION_MODULE
structure structure qui contiendra l’état du module DLL d’extension MFC après l’initialisation. L’état inclut une copie des objets de classe runtime qui ont été initialisés par la DLL d’extension MFC dans le cadre de la construction d’objets statiques normale exécutée avant DllMain
d’être entrés.
hModule
Handle du module DLL d’extension MFC.
Valeur de retour
TRUE
si la DLL d’extension MFC est correctement initialisée ; sinon, FALSE
.
Notes
Par exemple :
static AFX_EXTENSION_MODULE NVC_MFC_DLLDLL;
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// Remove this if you use lpReserved
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("NVC_MFC_DLL.DLL Initializing!\n");
// MFC extension DLL one-time initialization
if (!AfxInitExtensionModule(NVC_MFC_DLLDLL, hInstance))
return 0;
...
AfxInitExtensionModule
effectue une copie du HMODULE de la DLL et capture les classes runtime (CRuntimeClass
structures) de la DLL, ainsi que ses fabriques d’objets (COleObjectFactory
objets) à utiliser ultérieurement lors de la création de l’objet CDynLinkLibrary
.
Les DLL d’extension MFC doivent effectuer deux opérations dans leur DllMain
fonction :
Appelez
AfxInitExtensionModule
et vérifiez la valeur de retour.Créez un
CDynLinkLibrary
objet si la DLL exporte desCRuntimeClass
objets Structure ou possède ses propres ressources personnalisées.
Vous pouvez appeler AfxTermExtensionModule
pour nettoyer la DLL d’extension MFC lorsque chaque processus se détache de la DLL d’extension MFC (qui se produit lorsque le processus se ferme ou lorsque la DLL est déchargée par un AfxFreeLibrary
appel).
Spécifications
Header :<afxdll_.h>
AfxSetAmbientActCtx
Utilisez cette fonction pour définir l’indicateur d’état par module, qui affecte le comportement WinSxS de MFC.
Syntaxe
void AFXAPI AfxSetAmbientActCtx(BOOL bSet);
Paramètres
bSet
Nouvelle valeur de l’indicateur d’état du module.
Notes
Lorsque l’indicateur est défini (qui est la valeur par défaut) et qu’un thread entre dans un module MFC (voir AFX_MANAGE_STATE
), le contexte du module est activé.
Si l’indicateur n’est pas défini, le contexte du module n’est pas activé lors de l’entrée.
Le contexte d’un module est déterminé à partir de son manifeste, souvent incorporé dans les ressources de module.
Exemple
BOOL CMFCListViewApp::InitInstance()
{
AfxSetAmbientActCtx(FALSE);
// Remainder of function definition omitted.
}
Spécifications
Header :<afxcomctl32.h>
AfxTermExtensionModule
Appelez cette fonction pour permettre au MFC de nettoyer la DLL d’extension MFC lorsque chaque processus se détache de la DLL (qui se produit lorsque le processus se termine ou lorsque la DLL est déchargée par un AfxFreeLibrary
appel).
Syntaxe
void AFXAPI AfxTermExtensionModule( AFX_EXTENSION_MODULE& state, BOOL bAll = FALSE );
Paramètres
state
Référence à la AFX_EXTENSION_MODULE
structure qui contient l’état du module DLL d’extension MFC.
bAll
Si la valeur est TRUE, nettoyez tous les modules DLL d’extension MFC. Sinon, nettoyez uniquement le module DLL actuel.
Notes
AfxTermExtensionModule
supprime tout stockage local attaché au module et supprime toutes les entrées du cache de mappage de messages. Par exemple :
static AFX_EXTENSION_MODULE NVC_MFC_DLLDLL;
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// Remove this if you use lpReserved
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("NVC_MFC_DLL.DLL Initializing!\n");
// MFC extension DLL one-time initialization
if (!AfxInitExtensionModule(NVC_MFC_DLLDLL, hInstance))
return 0;
new CMyDynLinkLibrary(NVC_MFC_DLLDLL);
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("NVC_MFC_DLL.DLL Terminating!\n");
// Terminate the library before destructors are called
AfxTermExtensionModule(NVC_MFC_DLLDLL);
}
return 1; // ok
}
Si votre application charge et libère dynamiquement des DLL d’extension MFC, veillez à appeler AfxTermExtensionModule
. Étant donné que la plupart des DLL d’extension MFC ne sont pas chargées dynamiquement (normalement, elles sont liées via leurs bibliothèques d’importation), l’appel à AfxTermExtensionModule
généralement n’est pas nécessaire.
Les DLL d’extension MFC doivent appeler AfxInitExtensionModule
dans leur DllMain
. Si la DLL exporte CRuntimeClass
des objets ou possède ses propres ressources personnalisées, vous devez également créer un CDynLinkLibrary
objet dans DllMain
.
Spécifications
Header :<afxdll_.h>
Voir aussi
Macros et globals
AfxMessageBox
Gestion des données d’état des modules MFC