AfxLoadLibrary
Uso AfxLoadLibrary de asignar un módulo de DLL.
HINSTANCE AFXAPI AfxLoadLibrary(
LPCTSTR lpszModuleName
);
Parámetros
lpszModuleName
Señala una cadena terminada en null que contiene el nombre del módulo (un archivo .DLL o .EXE). El nombre especificado es el nombre del módulo.Si la cadena especifica una ruta pero el archivo no existe en el directorio especificado, se produce un error en la función.
Si una ruta de acceso no se especifica y se omite la extensión de nombre de archivo, se anexa la extensión predeterminada .DLL. Sin embargo, la cadena de nombre de archivo puede incluir un carácter final de punto (.) para indicar que el nombre del módulo no tiene ninguna extensión. Si no se especifica ninguna ruta, las búsquedas de función para el archivo en la secuencia siguiente:
El directorio de que la aplicación ha cargado.
El directorio actual.
Directorio del sistema deWindows 95/98: The Windows. Directorio del sistema de 32 bits deWindows NT: The Windows. El nombre de este directorio es SYSTEM32.
Directorio del sistema de 16 bits deWindows NT only: The Windows. No hay ninguna función de Win32 que obtiene la ruta de acceso de este directorio, pero se busca. El nombre de este directorio es SYSTEM.
El directorio de Windows.
Los directorios que se enumeran en la variable de entorno PATH.
Valor devuelto
Si la función se realiza correctamente, el valor devuelto es un identificador al módulo. Si se produce un error en la función, el valor devuelto es NULL.
Comentarios
Devuelve un identificador que se puede utilizar en GetProcAddress para obtener la dirección de una función DLL. AfxLoadLibrary también se puede utilizar para asignar otros módulos ejecutables.
Cada proceso mantiene un recuento de referencia para cada módulo cargado de biblioteca. Se incrementa este recuento de referencia cada vez que se llama a AfxLoadLibrary se denomina y es cada vez reduce AfxFreeLibrary . Cuando el recuento de referencias llega a cero, el módulo es no asignados del espacio de direcciones del proceso de llamada y el identificador ya no es válido.
Asegúrese de utilizar AfxLoadLibrary y AfxFreeLibrary (en lugar de Win32 funciona LoadLibrary y FreeLibrary) si la aplicación utiliza varios subprocesos y si carga dinámicamente un archivo DLL de extensión. Mediante AfxLoadLibrary y AfxFreeLibrary garantiza que el código de inicio y de cierre que se ejecuta cuando la extensión se carga o descarga el archivo DLL no dañe el estado global de MFC.
Mediante AfxLoadLibrary en una aplicación requiere vincular dinámicamente al archivo DLL de MFC; el archivo de encabezado para AfxLoadLibrary, Afxdll_.h, solo se incluye si MFC está vinculada a la aplicación como una DLL. Esto se debe al diseño tiene que vincular al archivo DLL de MFC para utilizar o para crear archivos DLL de extensión.
Ejemplo
// 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();
}
Requisitos
Header: afxdll_.h