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
yafxRegFreeThreading
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 int
parámetro nRegFlags 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 int
parámetro nRegFlags 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