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. Use CREATE_SUSPENDED si quiere inicializar los datos de miembro del objeto CWinThread, como m_bAutoDelete o cualquier miembro de la clase derivada, antes de que el subproceso empiece a ejecutarse. Una vez que se complete la inicialización, use CWinThread::ResumeThread para empezar la ejecución del subproceso. El subproceso no se ejecutará hasta que se llame a CWinThread::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

Encabezadoafxwin.h

AfxContextMenuManager

Puntero al administrador de menús contextuales global.

Sintaxis

CContextMenuManager* afxContextMenuManager;

Requisitos

Encabezadoafxcontextmenumanager.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

Encabezadoafxwin.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:

  1. El módulo principal, si es una DLL de extensión MFC.

  2. Módulos que no son del sistema.

  3. Módulos específicos del lenguaje.

  4. El módulo principal, si es un archivo DLL del sistema.

  5. Módulos del sistema.

Requisitos

Encabezadoafxwin.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

Encabezadoafxdll_.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

Encabezadoafxwin.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

Encabezadoafxwin.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

Encabezadoafxwin.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

Encabezadoafxwin.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

Encabezadoafxstat_.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

Encabezadoafxwin.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

Encabezadoafxwin.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

Encabezadoafxwin.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

Encabezadoafxwin.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

Encabezadoafxpriv.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

Encabezadoafxpriv.h:

AfxKeyboardManager

Puntero al administrador de teclado global.

Sintaxis

CKeyboardManager* afxKeyboardManager;

Requisitos

Encabezadoafxkeyboardmanager.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

Encabezadoafxdll_.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

Encabezadoafxdll_.h

AfxMenuTearOffManager

Puntero al administrador de menús desplazables global.

Sintaxis

CMenuTearOffManager* g_pTearOffMenuManager;

Requisitos

Encabezadoafxmenutearoffmanager.h:

AfxMouseManager

Puntero al administrador de mouse global.

Sintaxis

CMouseManager* afxMouseManager;

Requisitos

Encabezadoafxmousemanager.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

Encabezadoafxwin.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

Encabezadoafxwin.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

Encabezadoafxstat_.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

Encabezadoafxwin.h

AfxShellManager

Puntero al administrador de shell global.

Sintaxis

CShellManager* afxShellManager;

Requisitos

Encabezadoafxshellmanager.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

Encabezadoafxsock.h

AfxUserToolsManager

Puntero al administrador de herramientas de usuario global.

Sintaxis

CUserToolsManager* afxUserToolsManager;

Requisitos

Encabezadoafxusertoolsmanager.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

Encabezadoafxwin.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)