Registrar controles OLE

Se puede acceder a los controles OLE, al igual que a otros objetos de servidor OLE, mediante otras aplicaciones compatibles con OLE. Esto se logra registrando la biblioteca de tipos y la clase del control.

Las funciones siguientes permiten agregar y quitar la clase, las páginas de propiedades y la biblioteca de tipos del control en la base de datos de registro de Windows:

Registrar controles OLE

Nombre Descripción
AfxOleRegisterControlClass Agrega la clase del control a la base de datos de registro.
AfxOleRegisterPropertyPageClass Agrega una página de propiedades de control a la base de datos de registro.
AfxOleRegisterTypeLib Agrega la biblioteca de tipos del control a la base de datos de registro.
AfxOleUnregisterClass Quita una clase de control o una clase de página de propiedades de la base de datos de registro.
AfxOleUnregisterTypeLib Quita la biblioteca de tipos del control de la base de datos de registro.

Normalmente se llama a AfxOleRegisterTypeLib en la implementación de un archivo DLL de control de DllRegisterServer. Del mismo modo, DllUnregisterServer llama a AfxOleUnregisterTypeLib. Normalmente, la función miembro UpdateRegistry de la página de propiedades o generador de clases de un control llama a AfxOleRegisterControlClass, AfxOleRegisterPropertyPageClass y AfxOleUnregisterClass.

AfxOleRegisterControlClass

Registra la clase de control con la base de datos de registro de Windows.

BOOL AFXAPI AfxOleRegisterControlClass(
    HINSTANCE hInstance,
    REFCLSID clsid,
    LPCTSTR pszProgID,
    UINT idTypeName,
    UINT idBitmap,
    int nRegFlags,
    DWORD dwMiscStatus,
    REFGUID tlid,
    WORD wVerMajor,
    WORD wVerMinor);

Parámetros

hInstance
Identificador de instancia del módulo asociado a la clase de control.

clsid
El Id. de clase único del control.

pszProgID
Identificador de programa único del control.

idTypeName
Id. de recurso de la cadena que contiene un nombre de tipo legible por el usuario para el control.

idBitmap
Id. de recurso del mapa de bits usado para representar el control OLE en una barra de herramientas o paleta.

nRegFlags
Contiene una o varias de las marcas siguientes:

  • afxRegInsertable Permite que el control aparezca en el cuadro de diálogo Insertar objeto para objetos OLE.

  • afxRegApartmentThreading Establece el modelo de subprocesos en el registro en ThreadingModel=Apartment.

  • afxRegFreeThreading Establece el modelo de subprocesos en el registro en ThreadingModel=Free.

    Puede combinar las dos marcas afxRegApartmentThreading y afxRegFreeThreading para establecer ThreadingModel=Both. Vea InprocServer32 en Windows SDK para obtener más información sobre el registro de modelos de subprocesos.

Nota:

En las versiones de MFC anteriores a MFC 4.2, el parámetro intnRegFlags era un parámetro BOOL, bInsertable, que permitía o no permitía insertar el control desde el cuadro de diálogo Insertar objeto.

dwMiscStatus
Contiene una o varias de las marcas de estado siguientes (para obtener una descripción de las marcas, vea Enumeración OLEMISC en Windows SDK):

  • OLEMISC_RECOMPOSEONRESIZE

  • OLEMISC_ONLYICONIC

  • OLEMISC_INSERTNOTREPLACE

  • OLEMISC_STATIC

  • OLEMISC_CANTLINKINSIDE

  • OLEMISC_CANLINKBYOLE1

  • OLEMISC_ISLINKOBJECT

  • OLEMISC_INSIDEOUT

  • OLEMISC_ACTIVATEWHENVISIBLE

  • OLEMISC_RENDERINGISDEVICEINDEPENDENT

  • OLEMISC_INVISIBLEATRUNTIME

  • OLEMISC_ALWAYSRUN

  • OLEMISC_ACTSLIKEBUTTON

  • OLEMISC_ACTSLIKELABEL

  • OLEMISC_NOUIACTIVATE

  • OLEMISC_ALIGNABLE

  • OLEMISC_IMEMODE

  • OLEMISC_SIMPLEFRAME

  • OLEMISC_SETCLIENTSITEFIRST

tlid
Id. único de la clase de control.

wVerMajor
Número de la versión principal de la clase de control.

wVerMinor
Número de la versión secundaria de la clase de control.

Valor devuelto

Distinto de cero si se registró la clase de control; de lo contrario, es 0.

Comentarios

Esto permite que los contenedores que sean compatibles con el control OLE utilicen el control. AfxOleRegisterControlClass actualiza el registro con el nombre y la ubicación del control en el sistema y también establece el modelo de subprocesos que admite el control en el registro. Para obtener más información, vea Nota técnica 64, "Subprocesamiento de modelo apartamento en los controles OLE" y Acerca de los procesos y subprocesos en Windows SDK.

Ejemplo

// Member function implementation of class COleObjectFactory::UpdateRegistry
//
BOOL CMyAxCtrl::CMyAxCtrlFactory::UpdateRegistry(BOOL bRegister)
{
   // TODO: Verify that your control follows apartment-model threading rules.
   // Refer to MFC TechNote 64 for more information.
   // If your control does not conform to the apartment-model rules, then
   // you must modify the code below, changing the 6th parameter from
   // afxRegInsertable | afxRegApartmentThreading to afxRegInsertable.

   if (bRegister)
      return AfxOleRegisterControlClass(
          AfxGetInstanceHandle(),
          m_clsid,
          m_lpszProgID,
          IDS_NVC_MFCAXCTL,
          IDB_NVC_MFCAXCTL,
          afxRegInsertable | afxRegApartmentThreading,
          _dwMyOleMisc,
          _tlid,
          _wVerMajor,
          _wVerMinor);
   else
      return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
}

En el ejemplo anterior se muestra cómo se llama a AfxOleRegisterControlClass con la marca para que se pueda insertar, así como la marca para el modelo apartamento ORed juntos a fin de crear el sexto parámetro:

afxRegInsertable | afxRegApartmentThreading,

El control se mostrará en el cuadro de diálogo Insertar objeto para contenedores habilitados y será compatible con el modelo apartamento. Los controles compatibles con el modelo apartamento deben asegurarse de que hay bloqueos que protegen los datos de clase estática, de modo que, mientras un control de un apartamento accede a los datos estáticos, el programador no lo deshabilita antes de finalizar y otra instancia de la misma clase comienza a usar los mismos datos estáticos. Todos los accesos a los datos estáticos los rodeará código de sección crítico.

Requisitos

Encabezado: afxctl.h

AfxOleRegisterPropertyPageClass

Registra la clase de página de propiedades con la base de datos de registro de Windows.

BOOL AFXAPI AfxOleRegisterPropertyPageClass(
   HINSTANCE hInstance,
   REFCLSID  clsid,
   UINT idTypeName,
   int nRegFlags);

Parámetros

hInstance
Identificador de instancia del módulo asociado a la clase de página de propiedades.

clsid
Id. de clase único de la página de propiedades.

idTypeName
Id. de recurso de la cadena que contiene un nombre legible por el usuario para la página de propiedades.

nRegFlags
Puede contener la marca:

  • afxRegApartmentThreading Establece el modelo de subprocesos en el registro en ThreadingModel=Apartment.

Nota:

En las versiones de MFC anteriores a MFC 4.2, el parámetro intnRegFlags no estaba disponible. Tenga en cuenta también que la marca afxRegInsertable no es una opción válida para las páginas de propiedades y provocará un elemento ASSERT en MFC si se establece.

Valor devuelto

Distinto de cero si se registró la clase de control; de lo contrario, es 0.

Comentarios

Esto permite que los contenedores que sean compatibles con el control OLE utilicen la página de propiedades. AfxOleRegisterPropertyPageClass actualiza el registro con el nombre de la página de propiedades y su ubicación en el sistema, y también establece el modelo de subprocesos que admite el control en el registro. Para obtener más información, vea Nota técnica 64, "Subprocesamiento de modelo apartamento en los controles OLE" y Acerca de los procesos y subprocesos en Windows SDK.

Requisitos

Encabezado: afxctl.h

AfxOleRegisterTypeLib

Registra la biblioteca de tipos con la base de datos de registro de Windows y permite que otros contenedores compatible con el control OLE usen la biblioteca de tipos.

BOOL AfxOleRegisterTypeLib(
    HINSTANCE hInstance,
    REFGUID tlid,
    LPCTSTR pszFileName = NULL,
    LPCTSTR pszHelpDir  = NULL);

Parámetros

hInstance
Identificador de instancia de la aplicación asociada a la biblioteca de tipos.

tlid
Id. único de la biblioteca de tipos.

pszFileName
Apunta al nombre de archivo opcional de un archivo de biblioteca de tipos localizada (.TLB) para el control.

pszHelpDir
Nombre del directorio donde se puede encontrar el archivo de ayuda de la biblioteca de tipos. Si es NULL, se supone que el archivo de ayuda está en el mismo directorio que la propia biblioteca de tipos.

Valor devuelto

Distinto de cero si se registró la biblioteca de tipos; de lo contrario, es 0.

Comentarios

Esta función actualiza el registro con el nombre de la biblioteca de tipos y su ubicación en el sistema.

Ejemplo

// Type library guid definition.
const GUID CDECL BASED_CODE _tlid =
{ 0x77E58ED8, 0xA2C0, 0x4C13, { 0xB6, 0xC1, 0xBA, 0xD1, 0x19, 0xAF, 0xE3, 0xF1 } };

 

// Registers type library and the interfaces
// in it, afxctl.h needs to be included
if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
return ResultFromScode(SELFREG_E_TYPELIB);


// CMFCAutomation.tlb should be in the same directory as exe module.
// last param can be null if help file associated w/ tlb is in same dir as .tlb
if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid,
   _T("CMFCAutomation.tlb"), NULL))
{
   return ResultFromScode(SELFREG_E_TYPELIB);
}

Requisitos

Encabezado afxdisp.h

AfxOleUnregisterClass

Quita la entrada de clase de la página de propiedades o controles de la base de datos de registro de Windows.

BOOL AFXAPI AfxOleUnregisterClass(REFCLSID clsID, LPCSTR pszProgID);

Parámetros

clsID
Id. de clase único de la página de propiedades o controles.

pszProgID
Id. de programa único de la página de propiedades o controles.

Valor devuelto

Distinto de cero si la clase de página de propiedades o controles ha anulado correctamente el registro; de lo contrario, es 0.

Requisitos

Encabezado: afxctl.h

AfxOleUnregisterTypeLib

Llame a esta función para quitar la entrada de la biblioteca de tipos de la base de datos de registro de Windows.

BOOL AFXAPI AfxOleUnregisterTypeLib(REFGUID tlID);

Parámetros

tlID
Id. único de la biblioteca de tipos.

Valor devuelto

Distinto de cero si la biblioteca de tipos ha anulado correctamente el registro; de lo contrario, es 0.

Ejemplo

// Type library GUID, corresponds to the uuid attribute of the library
// section in the .odl file.
const GUID CDECL BASED_CODE _tlid =
    {0xA44774E8, 0xAE00, 0x451F, {0x96, 0x1D, 0xC7, 0xD2, 0xD2, 0x58, 0xA0, 0x75}};

// Type library major version number, number on the left of decimal
// point, in version attribute of the library section in .odl file.
const WORD _wVerMajor = 1;

// Type library minor version number, number on the right of decimal
// point, in version attribute of the library section in .odl file.
const WORD _wVerMinor = 0;

STDAPI DllUnregisterServer(void)
{
   AFX_MANAGE_STATE(_afxModuleAddrThis);

   if (!AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor))
      return ResultFromScode(SELFREG_E_TYPELIB);

   if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE))
      return ResultFromScode(SELFREG_E_CLASS);

   return NOERROR;
}

Requisitos

Encabezado afxdisp.h

Consulte también

Macros y globales