Control de la aplicación

OLE requiere un control sustancial sobre las aplicaciones y sus objetos. Los archivos DLL del sistema OLE deben poder iniciar y lanzar aplicaciones automáticamente, coordinar su producción y modificación de objetos, etc. Las funciones de este tema cumplen con esos requisitos. Estas funciones no solo deben ser llamadas por los archivos DLL del sistema OLE, sino también, en algunas ocasiones, por las aplicaciones.

Control de la aplicación

Nombre Descripción
AfxOleCanExitApp Indica si la aplicación puede finalizar.
AfxOleGetMessageFilter Recupera el filtro de mensajes actual de la aplicación.
AfxOleGetUserCtrl Recupera la marca de control de usuario actual.
AfxOleSetUserCtrl Establece o borra la marca de control de usuario.
AfxOleLockApp Incrementa el contador global del marco del número de objetos activos en una aplicación.
AfxOleLockControl Bloquea el generador de clases del control especificado.
AfxOleUnlockApp Disminuye el contador del marco del número de objetos activos en una aplicación.
AfxOleUnlockControl Desbloquea el generador de clases del control especificado.
AfxOleRegisterServerClass Registra un servidor en el registro del sistema OLE.
AfxOleSetEditMenu Implementa la interfaz de usuario para el comando de objeto typename.

AfxOleCanExitApp

Indica si la aplicación puede finalizar.

BOOL AFXAPI AfxOleCanExitApp();

Valor devuelto

Distinto de cero si la aplicación puede finalizar; de lo contrario, 0.

Comentarios

Una aplicación no debe finalizar si hay referencias pendientes a sus objetos. Las funciones globales AfxOleLockApp y AfxOleUnlockApp aumentan y disminuyen, respectivamente, un contador de referencias a los objetos de la aplicación. La aplicación no debe finalizar cuando este contador sea distinto de cero. Si el contador es distinto de cero, la ventana principal de la aplicación se oculta (no se destruye) cuando el usuario elige Cerrar en el menú del sistema o Salir en el menú Archivo. El marco llama a esta función en CFrameWnd::OnClose.

Ejemplo

// Helper exit function for automation server
BOOL CMainFrame::CanExit()
{
   if (AfxOleCanExitApp())
   {
      // No outstanding object counts - go ahead and exit
      return TRUE;
   }
   else
   {
      // There are outstanding OLE object counts...
      // hide app to give user impression that application has exited.
      ShowWindow(SW_HIDE);
      // take user out of control of the app
      AfxOleSetUserCtrl(FALSE);
      return FALSE;
   }
}

Requisitos

Encabezado: afxdisp.h

AfxOleGetMessageFilter

Recupera el filtro de mensajes actual de la aplicación.

COleMessageFilter* AFXAPI AfxOleGetMessageFilter();

Valor devuelto

Puntero al filtro de mensajes actual.

Comentarios

Llame a esta función para acceder al objeto derivado de COleMessageFilter actual, tal como llamaría a AfxGetApp para acceder al objeto de aplicación actual.

Ejemplo

COleMessageFilter *pFilter = AfxOleGetMessageFilter();
ASSERT_VALID(pFilter);
pFilter->BeginBusyState();
// do things requiring a busy state
pFilter->EndBusyState();

 

// Another example
//CWinApp-derived class
BOOL CCMFCAutomationApp::InitInstance()
{
   CWinApp::InitInstance();

   // Initialize OLE libraries
   if (!AfxOleInit())
   {
      AfxMessageBox(IDP_OLE_INIT_FAILED);
      return FALSE;
   }

   CWinThread *pThread = AfxGetThread();
   if (pThread != NULL)
   {
      // Destroy message filter, thereby unregistering it.
      delete pThread->m_pMessageFilter;
      pThread->m_pMessageFilter = NULL;

      // Create the new message filter object.
      //CMyMessageFilter is derived from COleMessageFilter
      pThread->m_pMessageFilter = new CMyMessageFilter;
      ASSERT(AfxOleGetMessageFilter() != NULL);

      // Register the new message filter object.
      AfxOleGetMessageFilter()->Register();
   }
   //...
   //...
   //...
}

Requisitos

Encabezado: afxwin.h

AfxOleGetUserCtrl

Recupera la marca de control de usuario actual.

BOOL AFXAPI AfxOleGetUserCtrl();

Valor devuelto

Distinto de cero si el usuario controla la aplicación; de lo contrario, 0.

Comentarios

El usuario controla la aplicación cuando el usuario ha abierto o creado explícitamente un documento nuevo. El usuario también tiene el control si los archivos DLL del sistema OLE no iniciaron la aplicación; en otras palabras, si el usuario inició la aplicación con el shell del sistema.

Requisitos

Encabezado: afxdisp.h

AfxOleSetUserCtrl

Establece o borra la marca de control de usuario, que se explica en la referencia para AfxOleGetUserCtrl.

void AFXAPI AfxOleSetUserCtrl(BOOL bUserCtrl);

Parámetros

bUserCtrl
Especifica si la marca de control de usuario se va a establecer o borrar.

Comentarios

El marco llama a esta función cuando el usuario crea o carga un documento, pero no cuando se carga o crea un documento a través de una acción indirecta, como cargar un objeto insertado desde una aplicación contenedora.

Llame a esta función si otras acciones de la aplicación deben poner al usuario en control de la aplicación.

Requisitos

Encabezado: afxdisp.h

AfxOleLockApp

Incrementa el contador global del marco del número de objetos activos en la aplicación.

void AFXAPI AfxOleLockApp();

Comentarios

El marco mantiene un contador del número de objetos activos en una aplicación. Las funciones AfxOleLockApp y AfxOleUnlockApp aumentan y disminuyen este contador, respectivamente.

Cuando el usuario intenta cerrar una aplicación que tiene objetos activos (una aplicación para la que el contador de objetos activos es distinto de cero), el marco oculta la aplicación de la vista del usuario en lugar de cerrarla por completo. La función AfxOleCanExitApp indica si la aplicación puede finalizar.

Llame a AfxOleLockApp desde cualquier objeto que exponga interfaces OLE si no desea que se destruya a ese objeto mientras lo sigue utilizando una aplicación cliente. Llame también a AfxOleUnlockApp en el destructor de cualquier objeto que llama a AfxOleLockApp en el constructor. De manera predeterminada, COleDocument, y las clases derivadas, bloquean y desbloquean automáticamente la aplicación.

Ejemplo

// Below is a code sample from an  Application Wizard-generated SDI
// Application with Automation support. The Application Wizard adds a
// dispatch interface to the document class. AfxOleLockApp() and
// AfxOleUnlockApp() respectively increment and decrement the
// application's object count. When the object count is equal to
// zero and if the user has not taken control of the application,
// the server is terminated.

CCMFCAutomationDoc::CCMFCAutomationDoc()
{
   EnableAutomation();
   AfxOleLockApp();
}

CCMFCAutomationDoc::~CCMFCAutomationDoc()
{
   AfxOleUnlockApp();
}

Requisitos

Encabezado: afxdisp.h

AfxOleUnlockApp

Disminuye el contador del marco de objetos activos en la aplicación.

void AFXAPI AfxOleUnlockApp();

Comentarios

Para más información, consulte AfxOleLockApp.

Cuando el número de objetos activos llega a cero, se llama a AfxOleOnReleaseAllObjects.

Ejemplo

Consulte el ejemplo para AfxOleLockApp.

Requisitos

Encabezado: afxdisp.h

AfxOleLockControl

Bloquea el generador de clases del control especificado para que los datos creados dinámicamente que están asociados al control permanezcan en memoria.

Sintaxis

BOOL AFXAPI AfxOleLockControl(  REFCLSID clsid  );
BOOL AFXAPI AfxOleLockControl( LPCTSTR lpszProgID );

Parámetros

clsid
El Id. de clase único del control.

lpszProgID
Identificador de programa único del control.

Valor devuelto

Distinto de cero si el generador de clases del control se bloqueó correctamente; de lo contrario, 0.

Comentarios

Esto puede acelerar considerablemente la visualización de los controles. Por ejemplo, una vez que crea un control en un cuadro de diálogo y bloquea el control con AfxOleLockControl, no es necesario crearlo y volver a terminarlo cada vez que se muestra o se destruye el diálogo. Si el usuario abre y cierra un cuadro de diálogo repetidamente, bloquear los controles puede mejorar considerablemente el rendimiento. Cuando esté listo para destruir el control, llame a AfxOleUnlockControl.

Ejemplo

// Starts and locks control's (Microsoft Calendar) class factory.
// Control will remain in memory for lifetime of
// application or until AfxOleUnlockControl() is called.

AfxOleLockControl(_T("MSCAL.Calendar"));

Requisitos

Encabezado: afxwin.h

AfxOleRegisterServerClass

Esta función permite registrar el servidor en el registro del sistema OLE.

BOOL AFXAPI AfxOleRegisterServerClass(
    REFCLSID clsid,
    LPCTSTR lpszClassName,
    LPCTSTR lpszShortTypeName,
    LPCTSTR lpszLongTypeName,
    OLE_APPTYPE nAppType = OAT_SERVER,
    LPCTSTR* rglpszRegister = NULL,
    LPCTSTR* rglpszOverwrite = NULL);

Parámetros

clsid
Referencia al identificador de clase OLE del servidor.

lpszClassName
Puntero a una cadena que contiene el nombre de clase de los objetos del servidor.

lpszShortTypeName
Puntero a una cadena que contiene el nombre corto del tipo de objeto del servidor, como "Gráfico".

lpszLongTypeName
Puntero a una cadena que contiene el nombre largo del tipo de objeto del servidor, como "Gráfico de Microsoft Excel 5.0".

nAppType
Valor, tomado de la enumeración OLE_APPTYPE, que especifica el tipo de aplicación OLE. Los valores posibles son los siguientes:

  • OAT_INPLACE_SERVER El servidor tiene una interfaz de usuario de servidor completa.

  • OAT_SERVER El servidor solo admite la inserción.

  • OAT_CONTAINER El contenedor admite vínculos a inserciones.

  • OAT_DISPATCH_OBJECT Objeto compatible con IDispatch.

rglpszRegister
Matriz de punteros a cadenas que representan las claves y los valores que se van a agregar al registro del sistema OLE si no se encuentran valores existentes para las claves.

rglpszOverwrite
Matriz de punteros a cadenas que representan las claves y los valores que se van a agregar al registro del sistema OLE si el registro contiene valores existentes para las claves dadas.

Valor devuelto

Distinto de cero si la clase de servidor se registra correctamente; de lo contrario, 0.

Comentarios

La mayoría de las aplicaciones pueden usar COleTemplateServer::Register para registrar los tipos de documento de la aplicación. Si el formato del registro del sistema de la aplicación no se ajusta al patrón típico, puede usar AfxOleRegisterServerClass para un mayor control.

El registro consta de un conjunto de claves y valores. Los argumentos rglpszRegister y rglpszOverwrite son matrices de punteros a cadenas, cada una de ellas formada por una clave y un valor separados por un carácter NULL ('\0'). Cada una de estas cadenas puede tener parámetros reemplazables cuyos lugares están marcados mediante las secuencias de caracteres %1 a %5.

Los símbolos se llenan de la manera siguiente:

Símbolo Valor
%1 Identificador de clase con formato de cadena
%2 Nombre de la clase
3 % Ruta de acceso al archivo ejecutable
4% Nombre de tipo corto
5 % Nombre de tipo largo

Requisitos

Encabezado: afxdisp.h

AfxOleSetEditMenu

Implementa la interfaz de usuario para el comando de objeto typename.

void AFXAPI AfxOleSetEditMenu(
    COleClientItem* pClient,
    CMenu* pMenu,
    UINT iMenuItem,
    UINT nIDVerbMin,
    UINT nIDVerbMax = 0,
    UINT nIDConvert = 0);

Parámetros

pClient
Puntero al elemento OLE de cliente.

pMenu
Puntero al objeto de menú que se va a actualizar.

iMenuItem
Índice del elemento de menú que se va a actualizar.

nIDVerbMin
Identificador de comando que corresponde al verbo principal.

nIDVerbMax
Identificador de comando que corresponde al último verbo.

nIDConvert
Identificador del elemento de menú Convertir.

Comentarios

Si el servidor reconoce solo un verbo principal, el elemento de menú se convierte en "objeto typename del verbo" y el comando nIDVerbMin se envía cuando el usuario elige el comando. Si el servidor reconoce varios verbos, el elemento de menú se convierte en "objeto typename" y aparece un submenú que enumera todos los verbos cuando el usuario elige el comando. Cuando el usuario elige un verbo del submenú, nIDVerbMin se envía si se elige el primer verbo, nIDVerbMin + 1 se envía si se elige el segundo verbo, y así sucesivamente. La implementación COleDocument predeterminada controla automáticamente esta característica.

Debe tener la instrucción siguiente en el archivo de script de recursos (.RC) de la aplicación del cliente:

#include <afxolecl.rc>

Requisitos

Encabezado: afxole.h

AfxOleUnlockControl

Desbloquea el generador de clases del control especificado.

Sintaxis

BOOL AFXAPI AfxOleUnlockControl( REFCLSID clsid );
BOOL AFXAPI AfxOleUnlockControl( LPCTSTR lpszProgID );

Parámetros

clsid
El Id. de clase único del control.

lpszProgID
Identificador de programa único del control.

Valor devuelto

Distinto de cero si el generador de clases del control se desbloqueó correctamente; de lo contrario, 0.

Comentarios

Un control se bloquea con AfxOleLockControl, de modo que los datos creados dinámicamente que están asociados al control permanecen en memoria. Esto puede acelerar considerablemente la visualización del control, porque no es necesario crear y destruir el control cada vez que se muestra. Cuando esté listo para destruir el control, llame a AfxOleUnlockControl.

Ejemplo

// Unlock control's (Microsoft Calendar Control) class factory.

AfxOleUnlockControl(_T("MSCAL.Calendar"));

Requisitos

Encabezado: afxwin.h

Consulte también

Macros y globales