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 propre up.
AfxInitExtensionModule Initialise la DLL.
AfxSetAmbientActCtx définissez l’indicateur d’état par module, qui affecte le comportement WinSxS de MFC.
AfxTermExtensionModule Permet à MFC de propre 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_CLASSde .

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 propre up.

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 :

Vous pouvez appeler AfxTermExtensionModule à propre la DLL d’extension MFC lorsque chaque processus se détache de la DLL d’extension MFC (qui se produit lorsque le processus se termine 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 autoriser MFC à propre 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, propre tous les modules DLL d’extension MFC. Sinon, propre 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