Condividi tramite


AfxLoadLibrary

Utilizzare AfxLoadLibrary per eseguire il mapping di un modulo DLL.

HINSTANCE AFXAPI AfxLoadLibrary( 
   LPCTSTR lpszModuleName  
);

Parametri

  • lpszModuleName
    Punta a una stringa con terminazione null che contiene il nome del modulo (DLL o EXE). Il nome specificato è il nome del file del modulo.

    Se la stringa specifica un percorso ma il file non esiste nella directory specificata, la funzione ha esito negativo.

    Se un percorso non viene specificato e l'estensione del file viene omessa, l'estensione predefinita .DLL viene applicata. Tuttavia, la stringa del nome file può includere un carattere finale punto (.) per indicare che il nome del modulo non ha estensione. Quando invece non viene specificato alcun percorso, la funzione ricerca i file nella seguente sequenza:

    • La directory da cui l'applicazione è stata caricata.

    • La directory corrente.

    • Windows 95/98: La directory di sistema di Windows. Windows NT: La directory di sistema di Windows a 32 bit. Il nome della directory in SYSTEM32.

    • Solo Windows NT: La directory di sistema di Windows a 16 bit. Non esiste una funzione Win32 che ottiene il percorso di questa directory, ma viene trovato. Il nome della directory è SYSTEM.

    • La directory Windows.

    • Le directory elencate nella variabile di ambiente PATH.

Valore restituito

Se la funzione viene eseguita correttamente, il valore restituito è un punto di controllo del modulo. Se la funzione ha esito negativo, il valore restituito è NULL.

Note

Restituisce un punto di controllo che può essere utilizzato in GetProcAddress per ottenere l'indirizzo di una funzione DLL. AfxLoadLibrary può essere utilizzato per eseguire il mapping degli altri moduli eseguibili.

Ogni processo mantiene un conteggio dei riferimenti per ogni modulo delle librerie caricate. Questo conteggio dei riferimenti viene incrementato ogni volta che AfxLoadLibrary viene chiamato e viene decrementato ogni colta che AfxFreeLibrary viene chiamato. Quando il conteggio dei riferimenti arriva a zero, il modulo viene disassociato dallo spazio degli indirizzi del processo chiamante e l'handle non è più valido.

Accertarsi di utilizzare AfxLoadLibrary e AfxFreeLibrary (anziché le funzioni Win32 LoadLibrary e FreeLibrary) se l'applicazione utilizza più thread e se viene caricata in modo dinamico un'estensione DLL. L'utilizzo di AfxLoadLibrary e AfxFreeLibrary assicura che nel codice di avvio e di chiusura eseguito quando si carica e si scarica la DLL di estensione non vi sia nulla che danneggi lo stato MFC globale.

Utilizzare AfxLoadLibrary in un'applicazione richiede di accedere in modo dinamico alla versione DLL di MFC; il file di intestazione per AfxLoadLibrary, Afxdll_.h, è incluso solo se MFC è collegato all'applicazione come DLL. Questo è dalla progettazione perché è necessario accedere alla versione DLL di MFC per utilizzare o creare le DLL di estensione.

Esempio

// 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();
}

Requisiti

Intestazione: afxdll_.h

Vedere anche

Riferimenti

AfxFreeLibrary

Concetti

Macro e funzioni globali MFC