Información y administración de aplicaciones
Cuando escribe una aplicación, crea un objeto único derivado de CWinApp
. En algunas ocasiones, puede que quiera obtener información sobre este objeto desde fuera del objeto derivado de CWinApp
. O quizás necesite acceder a otros objetos globales de "administrador".
La biblioteca MFC (Microsoft Foundation Class) proporciona las funciones globales siguientes para ayudarlo a completar estas tareas:
Funciones de información y administración de aplicaciones
Nombre | Descripción |
---|---|
AfxBeginThread |
Crea un subproceso. |
AfxContextMenuManager |
Puntero al administrador de menús contextuales global. |
AfxEndThread |
Finaliza el subproceso actual. |
AfxFindResourceHandle |
Recorre la cadena de recursos y ubica un recurso específico por identificador de recurso y tipo de recurso. |
AfxFreeLibrary |
Disminuye el recuento de referencias del módulo de biblioteca de vínculos dinámicos (DLL) cargado. Cuando el recuento de referencias llega a cero, se desasigna el módulo. |
AfxGetApp |
Devuelve un puntero al objeto CWinApp único de la aplicación. |
AfxGetAppName |
Devuelve una cadena que contiene el nombre de la aplicación. |
AfxGetInstanceHandle |
Devuelve un HINSTANCE que representa esta instancia de la aplicación. |
AfxGetMainWnd |
Devuelve un puntero a la ventana "principal" actual de una aplicación que no es OLE, o bien la ventana de marco en contexto de una aplicación de servidor. |
AfxGetPerUserRegistration |
Use esta función para determinar si la aplicación redirige el acceso del Registro al nodo HKEY_CURRENT_USER (HKCU ). |
AfxGetResourceHandle |
Devuelve un HINSTANCE al origen de los recursos predeterminados de la aplicación. Úsela para acceder directamente a los recursos de la aplicación. |
AfxGetThread |
Recupera un puntero al objeto CWinThread actual. |
AfxInitRichEdit |
Inicializa el control de edición enriquecido en versión 1.0 para la aplicación. |
AfxInitRichEdit2 |
Inicializa el control de edición enriquecido en versión 2.0 y posterior para la aplicación. |
AfxIsExtendedFrameClass |
Determina si la ventana dada es un objeto de marco extendido. |
AfxIsMFCToolBar |
Determina si la ventana dada es un objeto de la barra de herramientas. |
AfxKeyboardManager |
Puntero al administrador de teclado global. |
AfxLoadLibrary |
Asigna un módulo DLL y devuelve un identificador que se puede usar para obtener la dirección de una función DLL. |
AfxLoadLibraryEx |
Asigna un módulo DLL con las opciones especificadas y devuelve un identificador que se puede usar para obtener la dirección de una función DLL. |
AfxMenuTearOffManager |
Puntero al administrador de menús desplazables global. |
AfxMouseManager |
Puntero al administrador de mouse global. |
AfxRegisterClass |
Registra una clase de ventana en una DLL que usa MFC. |
AfxRegisterWndClass |
Registra una clase de ventana de Windows para complementar las que MFC registra automáticamente. |
AfxSetPerUserRegistration |
Establece si la aplicación redirige el acceso del Registro al nodo HKEY_CURRENT_USER (HKCU ). |
AfxSetResourceHandle |
Establece el identificador HINSTANCE donde se cargan los recursos predeterminados de la aplicación. |
AfxShellManager |
Puntero al administrador de shell global. |
AfxSocketInit |
Se llama en una invalidación CWinApp::InitInstance para inicializar Windows Sockets. |
AfxUserToolsManager |
Puntero al administrador de herramientas de usuario global. |
AfxWinInit |
La llama la función WinMain proporcionada por MFC, como parte de la inicialización CWinApp de una aplicación basada en GUI, para inicializar MFC. Se la debe llamar directamente para las aplicaciones de consola que utilizan MFC. |
AfxBeginThread
Llame a esta función para crear un subproceso.
CWinThread* AfxBeginThread(
AFX_THREADPROC pfnThreadProc,
LPVOID pParam,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);
CWinThread* AfxBeginThread(
CRuntimeClass* pThreadClass,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);
Parámetros
pfnThreadProc
Apunta a la función de control para el subproceso de trabajo. El puntero no puede ser NULL
. Esta función se debe declarar de la manera siguiente:
UINT __cdecl MyControllingFunction( LPVOID pParam );
pThreadClass
El RUNTIME_CLASS
de un objeto derivado de CWinThread
.
pParam
Parámetro que se va a pasar a la función de control.
nPriority
Prioridad que se va a establecer para el subproceso. Para una lista completa de las prioridades disponibles y su descripción, consulte SetThreadPriority
en Windows SDK.
nStackSize
Especifica el tamaño en bytes de la pila del subproceso nuevo. Si es 0, el tamaño de la pila toma como valor predeterminado el mismo que el del subproceso creador.
dwCreateFlags
Especifica una marca adicional que controla la creación del subproceso. Esta marca puede contener uno de estos dos valores:
CREATE_SUSPENDED
Iniciar el subproceso con un recuento de suspensiones de uno. UseCREATE_SUSPENDED
si quiere inicializar los datos de miembro del objetoCWinThread
, comom_bAutoDelete
o cualquier miembro de la clase derivada, antes de que el subproceso empiece a ejecutarse. Una vez que se complete la inicialización, useCWinThread::ResumeThread
para empezar la ejecución del subproceso. El subproceso no se ejecutará hasta que se llame aCWinThread::ResumeThread
.0 Iniciar el subproceso inmediatamente después de la creación.
lpSecurityAttrs
Apunta a una estructura SECURITY_ATTRIBUTES
que especifica los atributos de seguridad del subproceso. Si es NULL
, se usan los mismos atributos de seguridad que en el subproceso creador. Para más información sobre esta estructura, consulte Windows SDK.
Valor devuelto
Puntero al objeto del subproceso recién creado, o bien NULL
si se produce un error.
Comentarios
La primera forma de AfxBeginThread
crea un subproceso de trabajo. La segunda forma crea un subproceso que puede servir como subproceso de interfaz de usuario o como subproceso de trabajo.
AfxBeginThread
crea un objeto CWinThread
, llama a su función CreateThread
para empezar a ejecutar el subproceso y devuelve un puntero al subproceso. Se realizan comprobaciones en todo el procedimiento para asegurar que todos los objetos queden desasignados correctamente en caso de error en algún momento del proceso de creación. Para finalizar el subproceso, llame a AfxEndThread
desde dentro del subproceso o vuelva desde la función de control del subproceso de trabajo.
La aplicación debe habilitar multithreading; de lo contrario, se producirá un error en esta función. Para más información sobre cómo habilitar multithreading, consulte /MD
, /MT
, /LD
(Utilizar la biblioteca en tiempo de ejecución).
Para más información sobre AfxBeginThread
, consulte los artículos Multithreading: Crear subprocesos de trabajo y Multithreading: Crear subprocesos de interfaz de usuario.
Ejemplo
Vea el ejemplo de CSocket::Attach
.
Requisitos
Encabezado afxwin.h
AfxContextMenuManager
Puntero al administrador de menús contextuales global.
Sintaxis
CContextMenuManager* afxContextMenuManager;
Requisitos
Encabezado: afxcontextmenumanager.h
AfxEndThread
Llame a esta función para finalizar el subproceso en ejecución actual.
void AFXAPI AfxEndThread(
UINT nExitCode,
BOOL bDelete = TRUE);
Parámetros
nExitCode
Especifica el código de salida del subproceso.
bDelete
Elimina el objeto de subproceso de la memoria.
Comentarios
Se debe llamar desde dentro del subproceso que se va a finalizar.
Para más información sobre AfxEndThread
, consulte el artículo Multithreading: Finalizar subprocesos.
Requisitos
Encabezado afxwin.h
AfxFindResourceHandle
Use AfxFindResourceHandle
para recorrer la cadena de recursos y ubicar un recurso específico por identificador de recurso y tipo de recurso.
Sintaxis
HINSTANCE AFXAPI AfxFindResourceHandle( LPCTSTR lpszName, LPCTSTR lpszType );
Parámetros
lpszName
Puntero a una cadena que contiene el identificador de recurso.
lpszType
Puntero al tipo de recurso. Para una lista de los tipos de recursos, consulte FindResource
en Windows SDK.
Valor devuelto
Identificador del módulo que contiene el recurso.
Comentarios
AfxFindResourceHandle
busca el recurso específico y devuelve un identificador del módulo que contiene el recurso. El recurso puede estar en cualquier DLL de extensión MFC que está cargado. AfxFindResourceHandle
le indica cuál tiene el recurso.
Los módulos se buscan en este orden:
El módulo principal, si es una DLL de extensión MFC.
Módulos que no son del sistema.
Módulos específicos del lenguaje.
El módulo principal, si es un archivo DLL del sistema.
Módulos del sistema.
Requisitos
Encabezado: afxwin.h
AfxFreeLibrary
Tanto AfxFreeLibrary
como AfxLoadLibrary
mantienen un recuento de referencias para cada módulo de biblioteca cargado.
BOOL AFXAPI AfxFreeLibrary(HINSTANCE hInstLib);
Parámetros
hInstLib
Identificador del módulo de biblioteca cargado. AfxLoadLibrary
devuelve este identificador.
Valor devuelto
TRUE
si la función se realiza correctamente; de lo contrario, FALSE
.
Comentarios
AfxFreeLibrary
disminuye el recuento de referencias del módulo de biblioteca de vínculos dinámicos (DLL) cargado. Cuando el recuento de referencias llega a cero, se desasigna el módulo del espacio de direcciones del proceso de llamada y el identificador ya no es válido. Este recuento de referencias se incrementa cada vez que se llama a AfxLoadLibrary
.
Antes de desasignar un módulo de biblioteca, el sistema permite que el archivo DLL se desasocie de los procesos que lo utilizan. Si lo hace, el archivo DLL tiene la oportunidad de limpiar los recursos asignados para el proceso actual. Una vez que se devuelve la función de punto de entrada, el módulo de biblioteca se quita del espacio de direcciones del proceso actual.
Use AfxLoadLibrary
para asignar un módulo DLL.
Asegúrese de usar AfxFreeLibrary
y AfxLoadLibrary
(en lugar de las funciones FreeLibrary
y LoadLibrary
de Win32) si la aplicación usa varios subprocesos. El uso de AfxLoadLibrary
y AfxFreeLibrary
garantiza que el código de inicio y apagado que se ejecuta cuando se carga y descarga el archivo DLL de extensión de MFC no daña el estado global de MFC.
Ejemplo
Vea el ejemplo de AfxLoadLibrary
.
Requisitos
Encabezado afxdll_.h
AfxGetApp
Esta función devuelve un puntero que se puede usar para acceder a la información de la aplicación, como el código principal de envío de mensajes o la ventana en la posición superior.
CWinApp* AFXAPI AfxGetApp();
Valor devuelto
Puntero al objeto CWinApp
único para la aplicación.
Comentarios
Si este método devuelve NULL
, puede indicar que la ventana principal de la aplicación todavía no se inició completamente. También podría indicar un problema.
Ejemplo
// Print the application's executable filename.
TRACE(_T("Executable filename = %s\n"), AfxGetApp()->m_pszExeName);
Requisitos
Encabezado afxwin.h
AfxGetAppName
La cadena devuelta se puede usar para los mensajes de diagnóstico o como raíz para los nombres de cadenas temporales.
LPCTSTR AFXAPI AfxGetAppName();
Valor devuelto
Cadena terminada en un valor NULL que contiene el nombre de la aplicación.
Ejemplo
// Print the application name to the debugger output window.
TRACE(_T("Application name is %s\n"), AfxGetAppName());
Requisitos
Encabezado afxwin.h
AfxGetInstanceHandle
Esta función le permite recuperar el identificador de instancia de la aplicación actual.
HINSTANCE AFXAPI AfxGetInstanceHandle();
Valor devuelto
HINSTANCE
a la instancia actual de la aplicación. Si se llama desde un archivo DLL vinculado a la versión USRDLL de MFC, se devuelve HINSTANCE
al archivo DLL.
Comentarios
AfxGetInstanceHandle
siempre devuelve HINSTANCE
del archivo ejecutable (.EXE), a menos que se llame desde un archivo DLL vinculado con la versión USRDLL de MFC. En este caso, devuelve HINSTANCE
al archivo DLL.
Ejemplo
// Print the application instance handle to the debugger output window.
TRACE(_T("Application instance handle is 0x%0X\n"), AfxGetInstanceHandle());
Requisitos
Encabezado afxwin.h
AfxGetMainWnd
Si la aplicación es un servidor OLE, llame a esta función para recuperar un puntero a la ventana principal activa de la aplicación. Use este resultado en lugar de hacer referencia directamente al miembro m_pMainWnd
del objeto de aplicación.
CWnd* AFXAPI AfxGetMainWnd();
Valor devuelto
Devuelve un puntero al objeto de ventana de marco que contiene el documento activo en contexto, si el servidor tiene un objeto que está activo en contexto dentro de un contenedor activo.
Si no hay ningún objeto activo en contexto dentro de un contenedor o si la aplicación no es un servidor OLE, esta función devuelve el miembro m_pMainWnd
del objeto de aplicación.
Si se llama a AfxGetMainWnd
desde el subproceso principal de la aplicación, devuelve la ventana principal de la aplicación según las reglas anteriores. Si se llama a la función desde un subproceso secundario de la aplicación, la función devuelve la ventana principal asociada al subproceso que realizó la llamada.
Comentarios
Si la aplicación no es un servidor OLE, llamar a esta función equivale a hacer referencia directamente al miembro m_pMainWnd
del objeto de aplicación.
Ejemplo
//The following line send a WM_CLOSE message
// to the Application's main window. This will cause the
// Application to exit.
AfxGetMainWnd()->PostMessage(WM_CLOSE, 0, 0);
Requisitos
Encabezado afxwin.h
AfxGetPerUserRegistration
Use esta función para determinar si la aplicación redirige el acceso del Registro al nodo HKEY_CURRENT_USER
(HKCU
).
BOOL AFXAPI AfxGetPerUserRegistration();
Valor devuelto
TRUE
indica que la información del Registro se dirige al nodo HKCU
. FALSE
indica que la aplicación escribe información del Registro en el nodo predeterminado. El nodo predeterminado es HKEY_CLASSES_ROOT
(HKCR
).
Comentarios
Si habilita el redireccionamiento del Registro, el marco redirige el acceso de HKCR
a HKEY_CURRENT_USER\Software\Classes
. Solo los marcos MFC y ATL se ven afectados por el redireccionamiento.
Para cambiar si la aplicación redirige el acceso del Registro, use AfxSetPerUserRegistration
.
Requisitos
Encabezado afxstat_.h
AfxGetResourceHandle
Use el identificador HINSTANCE
que esta función devuelve para acceder directamente a los recursos de la aplicación, por ejemplo, en llamadas a la función FindResource
de Windows.
extern HINSTANCE AfxGetResourceHandle();
Valor devuelto
Un identificador HINSTANCE
donde se cargan los recursos predeterminados de la aplicación.
Ejemplo
//Load the menu specifying the module handle where resource is to be
//found & resource ID
HMENU hMenu = ::LoadMenu(AfxGetResourceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));
Requisitos
Encabezado afxwin.h
AfxGetThread
Llame a esta función para obtener un puntero al objeto CWinThread
que representa el subproceso en ejecución actualmente.
CWinThread* AfxGetThread();
Valor devuelto
Puntero al subproceso en ejecución actualmente; de lo contrario, NULL
.
Comentarios
Se debe llamar desde dentro del subproceso.
Nota:
Si va a portar un proyecto de MFC que llama a AfxGetThread
de las versiones 4.2, 5.0 o 6.0 de Visual C++, AfxGetThread
llama a AfxGetApp
si no se encuentra ningún subproceso. En versiones más recientes del compilador, AfxGetThread
devuelve NULL
si no se encontró ningún subproceso. Si desea el subproceso de la aplicación, debe llamar a AfxGetApp
.
Ejemplo
//Print the current thread ID in the Debug Window
TRACE(_T("Current Thread ID = 0x%X\n"), AfxGetThread()->m_nThreadID);
Requisitos
Encabezado afxwin.h
AfxInitRichEdit
Llame a esta función para inicializar el control de edición enriquecido (versión 1.0) para la aplicación.
BOOL AFXAPI AfxInitRichEdit();
Comentarios
Esta función se proporciona para la compatibilidad con versiones anteriores. Las aplicaciones nuevas deben usar AfxInitRichEdit2
.
AfxInitRichEdit
carga RICHED32.DLL
para inicializar la versión 1.0 del control de edición enriquecido. Si desea usar las versiones 2.0 y 3.0 del control de edición enriquecido, se debe cargar RICHED20.DLL
. Para cargarlo, llame a AfxInitRichEdit2
.
Para actualizar los controles de edición enriquecidos en aplicaciones existentes de Visual C++ a la versión 2.0, abra el archivo .RC como texto, cambie el nombre de clase de cada control de edición enriquecido de "RICHEDIT
" a "RichEdit20a
". Luego, reemplace la llamada a AfxInitRichEdit
por AfxInitRichEdit2
.
Esta función también inicializa la biblioteca de controles comunes, si la biblioteca todavía no se inicializa para el proceso. Si usa el control de edición enriquecido directamente desde la aplicación MFC, llame a esta función para asegurarse de que MFC inicializó correctamente el entorno de ejecución de control de edición enriquecido. Por lo general, si llama al método Create
de CRichEditCtrl
, CRichEditView
o CRichEditDoc
, no necesita llamar a esta función, pero puede resultar necesario en algunos casos.
Requisitos
Encabezado afxwin.h
AfxInitRichEdit2
Llame a esta función para inicializar el control de edición enriquecido (versión 2.0) para la aplicación.
BOOL AFXAPI AfxInitRichEdit2();
Comentarios
Llame a esta función para cargar RICHED20.DLL
e inicializar la versión 2.0 del control de edición enriquecido. Por lo general, si llama al método Create
de CRichEditCtrl
, CRichEditView
o CRichEditDoc
, no necesita llamar a esta función, pero puede resultar necesario en algunos casos.
Requisitos
Encabezado afxwin.h
AfxIsExtendedFrameClass
Determina si la ventana dada es un objeto de marco extendido.
Sintaxis
BOOL AFXAPI AfxIsExtendedFrameClass( CWnd* pWnd );
Parámetros
pWnd
[in] Puntero a un objeto que deriva de CWnd
.
Valor devuelto
TRUE
si la ventana proporcionada es un objeto de marco extendido; de lo contrario, FALSE
.
Comentarios
Este método devuelve TRUE
si pWnd
se deriva de una de las clases siguientes:
CFrameWndEx
CMDIFrameWndEx
COleIPFrameWndEx
COleDocIPFrameWndEx
CMDIChildWndEx
Este método es útil cuando tiene que validar que un parámetro de función o método es una ventana de marco extendido.
Requisitos
Encabezado: afxpriv.h
AfxIsMFCToolBar
Determina si la ventana dada es un objeto de la barra de herramientas.
Sintaxis
BOOL AFXAPI AfxIsMFCToolBar(CWnd* pWnd);
Parámetros
pWnd
[in] Puntero a un objeto que deriva de CWnd
.
Valor devuelto
TRUE
si la ventana proporcionada es un objeto de barra de herramientas; de lo contrario, FALSE
.
Comentarios
Este método devuelve TRUE
si pWnd
deriva de CMFCToolBar
. Este método es útil cuando tiene que validar que un parámetro de método o función es un objeto CMFCToolBar
.
Requisitos
Encabezado: afxpriv.h
AfxKeyboardManager
Puntero al administrador de teclado global.
Sintaxis
CKeyboardManager* afxKeyboardManager;
Requisitos
Encabezado: afxkeyboardmanager.h
AfxLoadLibrary
Use AfxLoadLibrary
para asignar un módulo DLL.
HINSTANCE AFXAPI AfxLoadLibrary(LPCTSTR lpszModuleName);
Parámetros
lpszModuleName
Apunta a una cadena terminada en un valor NULL que contiene el nombre del módulo (ya sea un archivo .DLL o .EXE). El nombre especificado es el nombre de archivo del módulo.
Si la cadena especifica una ruta de acceso, pero el archivo no existe en el directorio especificado, se produce un error en la función.
Si no se especifica una ruta de acceso y se omite la extensión del nombre de archivo, se anexará la extensión predeterminada .DLL. Sin embargo, la cadena de nombre de archivo puede incluir un carácter de punto final (.) para indicar que el nombre del módulo no tiene extensión. Cuando no se especifica ninguna ruta de acceso, la función utiliza el orden de búsqueda para aplicaciones de escritorio.
Valor devuelto
Si la función es correcta, el valor devuelto es un identificador del módulo. Si se produce un error, el valor devuelto es NULL
.
Comentarios
Devuelve un identificador que se puede usar en GetProcAddress
para obtener la dirección de una función DLL. AfxLoadLibrary
también se puede usar para asignar otros módulos ejecutables.
Cada proceso mantiene un recuento de referencias para cada módulo de biblioteca cargado. Este recuento de referencias aumenta cada vez que se llama a AfxLoadLibrary
y disminuye cada vez que se llama a AfxFreeLibrary
. Cuando el recuento de referencias llega a cero, se desasigna el módulo del espacio de direcciones del proceso de llamada y el identificador ya no es válido.
Asegúrese también de usar AfxLoadLibrary
y AfxFreeLibrary
(en lugar de las funciones LoadLibrary
y FreeLibrary
de Win32) si la aplicación usa varios subprocesos y si carga dinámicamente un archivo DLL de extensión MFC. El uso de AfxLoadLibrary
y AfxFreeLibrary
garantiza que el código de inicio y apagado que se ejecuta cuando se carga y descarga el archivo DLL de extensión de MFC no daña el estado global de MFC.
El uso de AfxLoadLibrary
en una aplicación requiere que se vincule dinámicamente a la versión DLL de MFC. El archivo de encabezado para AfxLoadLibrary
, Afxdll_.h
, solo se incluye si MFC está vinculado a la aplicación como archivo DLL. Este requisito está diseñado así, porque debe vincularse a la versión DLL de MFC para usar o crear archivos DLL de extensión de MFC.
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 initialization excluded.
return TRUE;
}
int CUserApp::ExitInstance()
{
if (NULL != m_hViewDll)
{
AfxFreeLibrary(m_hViewDll);
m_hViewDll = NULL;
}
return CWinApp::ExitInstance();
}
Requisitos
Encabezado afxdll_.h
AfxLoadLibraryEx
Use AfxLoadLibraryEx
para asignar un módulo DLL.
HINSTANCE AFXAPI AfxLoadLibraryEx(LPCTSTR lpFileName, HANDLE hFile, DWORD dwFlags);
Parámetros
lpFileName
Apunta a una cadena terminada en un valor NULL que contiene el nombre del módulo (ya sea un archivo .DLL o .EXE). El nombre especificado es el nombre de archivo del módulo.
Si la cadena especifica una ruta de acceso, pero el archivo no existe en el directorio especificado, se produce un error en la función.
Si no se especifica una ruta de acceso y se omite la extensión del nombre de archivo, se anexará la extensión predeterminada .DLL. Sin embargo, la cadena de nombre de archivo puede incluir un carácter de punto final (.) para indicar que el nombre del módulo no tiene extensión. Cuando no se especifica ninguna ruta de acceso, la función utiliza el orden de búsqueda para aplicaciones de escritorio.
hFile
Este parámetro se reserva para uso futuro. Debe ser NULL
.
dwFlags
Acción que se realizará al cargar el módulo. Si no se especifica ninguna marca, el comportamiento de esta función es idéntico a la función AfxLoadLibrary
. Los valores posibles de este parámetro se describen en la documentación de LoadLibraryEx
.
Valor devuelto
Si la función es correcta, el valor devuelto es un identificador del módulo. Si se produce un error, el valor devuelto es NULL
.
Comentarios
AfxLoadLibraryEx
devuelve un identificador que se puede usar en GetProcAddress
para obtener la dirección de una función DLL. AfxLoadLibraryEx
también se puede usar para asignar otros módulos ejecutables.
Cada proceso mantiene un recuento de referencias para cada módulo de biblioteca cargado. Este recuento de referencias aumenta cada vez que se llama a AfxLoadLibraryEx
y disminuye cada vez que se llama a AfxFreeLibrary
. Cuando el recuento de referencias llega a cero, se desasigna el módulo del espacio de direcciones del proceso de llamada y el identificador ya no es válido.
Asegúrese también de usar AfxLoadLibraryEx
y AfxFreeLibrary
(en lugar de las funciones LoadLibraryEx
y FreeLibrary
de Win32) si la aplicación usa varios subprocesos y si carga dinámicamente un archivo DLL de extensión MFC. El uso de AfxLoadLibraryEx
y AfxFreeLibrary
garantiza que el código de inicio y apagado que se ejecuta cuando se carga y descarga el archivo DLL de extensión de MFC no daña el estado global de MFC.
El uso de AfxLoadLibraryEx
en una aplicación requiere que se vincule dinámicamente a la versión DLL de MFC. El archivo de encabezado para AfxLoadLibraryEx
, Afxdll_.h
, solo se incluye si MFC está vinculado a la aplicación como archivo DLL. Este requisito está diseñado así, porque debe vincularse a la versión DLL de MFC para usar o crear archivos DLL de extensión de MFC.
Requisitos
Encabezado afxdll_.h
AfxMenuTearOffManager
Puntero al administrador de menús desplazables global.
Sintaxis
CMenuTearOffManager* g_pTearOffMenuManager;
Requisitos
Encabezado: afxmenutearoffmanager.h
AfxMouseManager
Puntero al administrador de mouse global.
Sintaxis
CMouseManager* afxMouseManager;
Requisitos
Encabezado: afxmousemanager.h
AfxRegisterClass
Use esta función para registrar clases de ventana en un archivo DLL que usa MFC.
BOOL AFXAPI AfxRegisterClass(WNDCLASS* lpWndClass);
Parámetros
lpWndClass
Puntero a una estructura WNDCLASS
que contiene información sobre la clase de ventana que se va a registrar. Para más información sobre esta estructura, consulte Windows SDK.
Valor devuelto
TRUE
si la clase se registra correctamente; de lo contrario, FALSE
.
Comentarios
Si usa esta función, se anula automáticamente el registro de la clase cuando se descarga el archivo DLL.
En compilaciones que no son DLL, el identificador AfxRegisterClass
se define como una macro que se asigna a la función RegisterClass
de Windows, ya que el registro de las clases registradas en una aplicación se anula automáticamente. Si usa AfxRegisterClass
en lugar de RegisterClass
, el código se puede usar sin cambiar tanto en una aplicación como en un archivo DLL.
Ejemplo
// Register your unique class name that you wish to use
WNDCLASS wndcls;
memset(&wndcls, 0, sizeof(WNDCLASS)); // start with NULL defaults
wndcls.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
//you can specify your own window procedure
wndcls.lpfnWndProc = ::DefWindowProc;
wndcls.hInstance = AfxGetInstanceHandle();
wndcls.hIcon = LoadIcon(wndcls.hInstance, MAKEINTRESOURCE(IDI_MYICON));
wndcls.hCursor = LoadCursor(wndcls.hInstance, MAKEINTRESOURCE(IDC_ARROW));
wndcls.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wndcls.lpszMenuName = NULL;
// Specify your own class name for using FindWindow later
wndcls.lpszClassName = _T("MyNewClass");
// Register the new class and trace if it fails
if(!AfxRegisterClass(&wndcls))
{
TRACE("Class Registration Failed\n");
}
Requisitos
Encabezado afxwin.h
AfxRegisterWndClass
Permite registrar sus propias clases de ventana.
LPCTSTR AFXAPI AfxRegisterWndClass(
UINT nClassStyle,
HCURSOR hCursor = 0,
HBRUSH hbrBackground = 0,
HICON hIcon = 0);
Parámetros
nClassStyle
Especifica el estilo de clase de Windows o la combinación de estilos, creados mediante el operador OR bit a bit (|
), para la clase de ventana. Para una lista de los estilos de clase, consulte la estructura WNDCLASS
en Windows SDK. Si es NULL
, los valores predeterminados se establecen de la manera siguiente:
Establece el estilo del mouse en
CS_DBLCLKS
, el que envía mensajes de doble clic al procedimiento de ventana cuando el usuario hace doble clic con el mouse.Establece el estilo del cursor de flecha en el estándar
IDC_ARROW
de Windows.Establece el pincel de fondo en
NULL
, para que la ventana no borre su fondo.Establece el icono en el icono de logotipo de Windows estándar, la bandera ondeante.
hCursor
Especifica un identificador del recurso de cursor que se va a instalar en cada ventana creada a partir de la clase de ventana. Si usa el valor predeterminado de 0, obtendrá el cursor IDC_ARROW
estándar.
hbrBackground
Especifica un identificador del recurso de pincel que se va a instalar en cada ventana creada a partir de la clase de ventana. Si usa el valor predeterminado de 0, tendrá un pincel de fondo NULL
y, de manera predeterminada, la ventana no borrará su fondo mientras procesa WM_ERASEBKGND
.
hIcon
Especifica un identificador del recurso de icono que se va a instalar en cada ventana creada a partir de la clase de ventana. Si usa el valor predeterminado de 0, obtendrá el icono de logotipo de Windows estándar, la bandera ondeante.
Valor devuelto
Cadena terminada en un valor NULL que contiene el nombre de clase. Puede pasar este nombre de clase a la función miembro Create
en CWnd
u otras clases derivadas **CWnd-
** para crear una ventana. La biblioteca MFC genera el nombre.
Nota:
El valor devuelto es un puntero a un búfer estático. Para guardar esta cadena, asígnela a una variable CString
.
Comentarios
La biblioteca MFC registra automáticamente varias clases de ventana estándar. Llame a esta función si quiere registrar sus propias clases de ventana.
El nombre registrado para una clase por AfxRegisterWndClass
depende únicamente de los parámetros. Si llama varias veces a AfxRegisterWndClass
con parámetros idénticos, solo registra una clase en la primera llamada. Las llamadas posteriores a AfxRegisterWndClass
con parámetros idénticos devuelven el nombre de clase ya registrado.
Si llama a AfxRegisterWndClass
para varias clases derivadas de CWnd
con parámetros idénticos, en lugar de obtener una clase de ventana separada para cada clase, cada clase comparte la misma clase de ventana. Este uso compartido puede generar problemas si se utiliza el estilo de clase CS_CLASSDC
. En lugar de varias clases de ventana CS_CLASSDC
, termina solo con una clase de ventana CS_CLASSDC
. Todas las ventanas de C++ que usan esa clase comparten el mismo DC. Para evitar este problema, llame a AfxRegisterClass
para registrar la clase.
Consulte la nota técnica TN001: Registro de clases de ventana para más información sobre el registro de clases de ventana y la función AfxRegisterWndClass
.
Ejemplo
CString strMyClass;
// load stock cursor, brush, and icon for
// my own window class
try
{
strMyClass = AfxRegisterWndClass(
CS_VREDRAW | CS_HREDRAW,
::LoadCursor(NULL, IDC_ARROW),
(HBRUSH)::GetStockObject(WHITE_BRUSH),
::LoadIcon(NULL, IDI_APPLICATION));
}
catch (CResourceException *pEx)
{
AfxMessageBox(_T("Couldn't register class! (Already registered?)"));
pEx->Delete();
}
Requisitos
Encabezado afxwin.h
AfxSetPerUserRegistration
Establece si la aplicación redirige el acceso del Registro al nodo HKEY_CURRENT_USER
(HKCU
).
void AFXAPI AfxSetPerUserRegistration(BOOL bEnable);
Parámetros
bEnable
[in] TRUE
indica que la información del Registro se dirige al nodo HKCU
. FALSE
indica que la aplicación escribe información del Registro en el nodo predeterminado. El nodo predeterminado es HKEY_CLASSES_ROOT
(HKCR
).
Comentarios
Antes de Windows Vista, las aplicaciones que accedían al Registro solían usar el nodo HKEY_CLASSES_ROOT
. Sin embargo, con Windows Vista o sistemas operativos posteriores, debe ejecutar una aplicación en modo con privilegios elevados para escribir en HKCR
.
Este método permite a la aplicación leer y escribir en el Registro sin ejecutarse en modo con privilegios elevados. Funciona si se redirige el acceso del Registro de HKCR
a HKCU
. Para obtener más información, consulta Linker Property Pages.
Si habilita el redireccionamiento del Registro, el marco redirige el acceso de HKCR
a HKEY_CURRENT_USER\Software\Classes
. Solo los marcos MFC y ATL se ven afectados por el redireccionamiento.
La implementación predeterminada tiene acceso al registro en HKCR
.
Requisitos
Encabezado afxstat_.h
AfxSetResourceHandle
Use esta función para establecer el identificador HINSTANCE
que determina si están cargados los recursos predeterminados de la aplicación.
void AFXAPI AfxSetResourceHandle(HINSTANCE hInstResource);
Parámetros
hInstResource
Identificador de instancia o módulo en un archivo .EXE o DLL desde el que se cargan los recursos de la aplicación.
Ejemplo
// This code is taken from CMyApp::InitInstance
HINSTANCE hRes = NULL;
hRes = LoadLibrary(_T("Resource.dll"));
if (hRes)
AfxSetResourceHandle(hRes);
Requisitos
Encabezado afxwin.h
AfxShellManager
Puntero al administrador de shell global.
Sintaxis
CShellManager* afxShellManager;
Requisitos
Encabezado: afxshellmanager.h
AfxSocketInit
Llame a esta función en la invalidación CWinApp::InitInstance
para inicializar Windows Sockets.
BOOL AfxSocketInit(WSADATA* lpwsaData = NULL);
Parámetros
lpwsaData
Un puntero a una estructura WSADATA
. Si lpwsaData
no es igual a NULL
, la dirección de la estructura WSADATA
se llena mediante la llamada a WSAStartup
. Esta función también garantiza que se llame a WSACleanup
en su nombre antes de que finalice la aplicación.
Valor devuelto
Es distinto de cero si la función se realiza correctamente; de lo contrario, es 0.
Comentarios
Al usar sockets de MFC en subprocesos secundarios en una aplicación de MFC vinculada estáticamente, debe llamar a AfxSocketInit
en cada subproceso que use sockets para inicializar las bibliotecas de sockets. De manera predeterminada, se llama a AfxSocketInit
solo en el subproceso principal.
Requisitos
Encabezado afxsock.h
AfxUserToolsManager
Puntero al administrador de herramientas de usuario global.
Sintaxis
CUserToolsManager* afxUserToolsManager;
Requisitos
Encabezado: afxusertoolsmanager.h
AfxWinInit
La función WinMain
proporcionada por MFC llama a esta función, como parte de la inicialización CWinApp
de una aplicación basada en GUID, para inicializar MFC.
BOOL AFXAPI AfxWinInit(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow);
Parámetros
hInstance
Identificador del módulo que se ejecuta actualmente.
hPrevInstance
Identificador de una instancia anterior de la aplicación. Este parámetro siempre es NULL
para una aplicación basada en Win32.
lpCmdLine
Apunta a una cadena terminada en un valor NULL que especifica la línea de comandos para la aplicación.
nCmdShow
Especifica cómo se mostraría la ventana principal de una aplicación de GUI.
Comentarios
En el caso de una aplicación de consola, que no usa la función WinMain
proporcionada por MFC, debe llamar directamente a AfxWinInit
para inicializar MFC.
Si usted mismo llama a AfxWinInit
, debe declarar una instancia de una clase CWinApp
. En el caso de una aplicación de consola, puede optar por no derivar su propia clase de CWinApp
y, en su lugar, usa directamente una instancia de CWinApp
. Esta técnica es adecuada si decide dejar toda la funcionalidad de la aplicación en la implementación de main
.
Nota:
Cuando crea un contexto de activación para un ensamblado, MFC usa un recurso de manifiesto proporcionado por el módulo de usuario. El contexto de activación se crea en AfxWinInit
. Para más información, consulte Compatibilidad con los contextos de activación en el estado del módulo MFC.
Ejemplo
#include <afx.h>
#include <afxdb.h>
int _tmain(int /*argc*/, TCHAR * /*argv[]*/, TCHAR * /*envp[]*/)
{
int nRetCode = 0;
// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
_tprintf(_T("Fatal Error: MFC initialization failed\n"));
nRetCode = 1;
}
else
{
// try to connect to an ODBC database that doesn't exist
// (this wouldn't work at all without initializing MFC)
CDatabase db;
try
{
db.Open(_T("This Databsae Doesn't Exist"));
// we shouldn't realistically get here
_tprintf_s(_T("Successful!\n")
_T("Closing ...\n"));
db.Close();
_tprintf_s(_T("Closed!"));
}
catch (CDBException *pEx)
{
// we got an exception! print an error message
// (this wouldn't work without initializing MFC)
TCHAR sz[1024];
_tprintf_s(_T("Error: "));
if (pEx->GetErrorMessage(sz, 1024))
_tprintf_s(sz);
else
_tprintf_s(_T("No error message was available"));
_tprintf_s(_T("\n"));
pEx->Delete();
nRetCode = 1;
}
}
return nRetCode;
}
Requisitos
Encabezado afxwin.h
Consulte también
Macros y globales
CWinApp
(clase)
CContextMenuManager
(clase)
CWnd
(clase)
CFrameWndEx
(clase)
CMFCToolBar
(clase)
CKeyboardManager
(clase)
CMenuTearOffManager
(clase)
CMouseManager
(clase)
CShellManager
(clase)
CUserToolsManager
(clase)