Partager via


AfxLoadLibrary

Utiliser AfxLoadLibrary pour mapper un module DLL.

HINSTANCE AFXAPI AfxLoadLibrary( 
   LPCTSTR lpszModuleName  
);

Paramètres

  • lpszModuleName
    Pointe vers la chaîne terminée par le caractère NULL qui contient le nom du module (un fichier .DLL ou fichier .exe). Le nom spécifié est le nom de fichier du module.

    Si la chaîne spécifie un chemin d'accès et le fichier n'existe pas dans le répertoire spécifié, la fonction échoue.

    Si le chemin d'accès n'est pas spécifié et que l'extension de nom de fichier est omise, la .DLL par défaut d'extension est ajoutée. Toutefois, la chaîne de nom de fichier peut inclure un caractère de fin point (.) pour indiquer que le nom du module n'a aucune extension. Lorsqu'aucun chemin d'accès n'est spécifié, la fonction recherche le fichier dans la séquence suivante :

    • Le répertoire que l'application a chargé.

    • Le répertoire actif.

    • Windows 95/98: Le répertoire System de Windows. Windows NT: le répertoire système Windows 32 bits. Le nom de ce répertoire est SYSTEM32.

    • Windows NT only: le répertoire système Windows 16 bits. Il n'existe aucune fonction Win32 qui obtient le chemin d'accès à ce répertoire, mais elle est recherchée. Le nom de ce répertoire est SYSTEM.

    • Le répertoire Windows.

    • Les répertoires désignés dans la variable d'environnement PATH.

Valeur de retour

Si la fonction réussit, la valeur de retour est un handle vers le module. Si la fonction échoue, la valeur de retour est NULL.

Notes

Retourne un descripteur qui peut être utilisé dans GetProcAddress pour obtenir l'adresse d'une fonction DLL. AfxLoadLibrary peut également être utilisée pour mapper les modules exécutables.

Chaque processus comptabilise le nombre de références pour chaque module de bibliothèque chargé. Ce nombre de références est incrémenté chaque fois que AfxLoadLibrary est appelée et est décrémenté chaque fois que AfxFreeLibrary est appelée. Lorsque le nombre de références atteint zéro, le module est démappé de l'espace d'adressage du processus appelant et le handle n'est plus valide.

Veillez à utiliser AfxLoadLibrary et AfxFreeLibrary (au lieu de Win32 des fonctions LoadLibrary et FreeLibrary) si votre application utilise des threads et si elle charge dynamiquement une DLL d'extension. L'utilisation de AfxLoadLibrary et de AfxFreeLibrary fait en sorte que le code de démarrage et d'arrêt qui s'exécute lors du chargement et du déchargement de la DLL d'extension n'altère pas l'état global des MFC.

Utilisation AfxLoadLibrary dans une application vous oblige à lier dynamiquement à la version de DLL de MFC ; le fichier d'en-tête pour AfxLoadLibrary, Afxdll_.h, est inclus uniquement si MFC est lié à l'application en tant que DLL. C'est là la procédure normale car vous devez lier à la version de DLL de MFC pour utiliser ou créer des DLL d'extension.

Exemple

// The following shows how to create a MDI based application 
// using a generic CView derived class that is implemented in 
// a dynamically loaded MFC Extension DLL. 

typedef CRuntimeClass * (*GETDLLVIEW)();

BOOL CUserApp::InitInstance()
{
   // Standard Application Wizard generated initialization excluded.



...


   // Register the application's document templates.  Document templates 
   //  serve as the connection between documents, frame windows and views 

   //Load MFC Extension DLL based view class.
   m_hViewDll = AfxLoadLibrary(szMyViewDllPath);
   if (!m_hViewDll)
   {
      CString str;
      str.Format(_T("Error: Cannot find component %s"), szMyViewDllPath);
      AfxMessageBox(str);
      return FALSE;
   }

   GETDLLVIEW GetMyView = (GETDLLVIEW)GetProcAddress(m_hViewDll, "GetMyView");
   ASSERT(GetMyView != NULL);

   CMultiDocTemplate* pDocTemplate;
   pDocTemplate = new CMultiDocTemplate(IDR_NVC_MFC_DLLUserTYPE,
      RUNTIME_CLASS(CUserDoc),
      RUNTIME_CLASS(CChildFrame), // custom MDI child frame
      GetMyView());
   if (!pDocTemplate)
      return FALSE;
   AddDocTemplate(pDocTemplate);

   // Standard Application Wizard generated initalization excluded.



...


   return TRUE;
}

int CUserApp::ExitInstance()
{
   if (NULL != m_hViewDll)
   {
      AfxFreeLibrary(m_hViewDll);
      m_hViewDll = NULL;
   }

   return CWinApp::ExitInstance();
}

Configuration requise

En-tête : afxdll_.h

Voir aussi

Référence

AfxFreeLibrary

Concepts

macro MFC et Globals