Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
La compatibilidad con licencias, una característica opcional de controles ActiveX, le permite controlar quién puede usar o distribuir el control. (Para obtener más información sobre los problemas de licencias, consulte Problemas de licencias en actualización de un control ActiveX existente).
Importante
ActiveX es una tecnología heredada que no se debe usar para el desarrollo nuevo. Para obtener más información sobre las tecnologías modernas que sustituyen a ActiveX, consulte Controles ActiveX.
En este artículo se tratan los temas siguientes:
Los controles ActiveX que implementan licencias le permiten, como desarrollador de controles, determinar cómo usarán otros usuarios el control ActiveX. Proporcione al comprador del control el control y el archivo .LIC, con el acuerdo de que el comprador puede distribuir el control, pero no el archivo .LIC, con una aplicación que use el control. Esto impide que los usuarios de esa aplicación escriban nuevas aplicaciones que usen el control, sin antes licenciar el control de usted.
Introducción a las licencias de control ActiveX
Para proporcionar compatibilidad con licencias para controles ActiveX, la clase COleObjectFactory proporciona una implementación para varias funciones en la IClassFactory2 interfaz: IClassFactory2::RequestLicKey, IClassFactory2::GetLicInfoy IClassFactory2::CreateInstanceLic. Cuando el desarrollador de la aplicación contenedora realiza una solicitud para crear una instancia del control, se realiza una llamada a GetLicInfo para comprobar que el archivo de control .LIC está presente. Si el control tiene licencia, se puede crear y colocar una instancia del control en el contenedor. Después de que el desarrollador haya terminado de construir la aplicación contenedora, se realiza otra llamada de función, esta vez a RequestLicKey, . Esta función devuelve una clave de licencia (una cadena de caracteres simple) a la aplicación contenedora. A continuación, la clave devuelta se inserta en la aplicación.
En la ilustración siguiente se muestra la comprobación de licencia de un control ActiveX que se usará durante el desarrollo de una aplicación contenedora. Como se mencionó anteriormente, el desarrollador de la aplicación contenedora debe tener el archivo .LIC adecuado instalado en la máquina de desarrollo para crear una instancia del control.
Comprobación de un control ActiveX con licencia durante el desarrollo
El siguiente proceso, que se muestra en la ilustración siguiente, se produce cuando el usuario final ejecuta la aplicación contenedora.
Cuando se inicia la aplicación, normalmente es necesario crear una instancia del control. El contenedor lo logra realizando una llamada a CreateInstanceLic, pasando la clave de licencia incrustada como parámetro. A continuación, se realiza una comparación de cadenas entre la clave de licencia incrustada y la propia copia del control de la clave de licencia. Si la coincidencia es exitosa, se crea una instancia del control y la aplicación continúa ejecutándose de forma normal. Tenga en cuenta que el archivo .LIC no necesita estar presente en el equipo del usuario del control.
Comprobación de un control ActiveX con licencia durante la ejecución
Las licencias de control constan de dos componentes básicos: código específico en el archivo DLL de implementación de control y el archivo de licencia. El código se compone de dos llamadas de función (o posiblemente tres) y una cadena de caracteres, a partir de entonces denominada "cadena de licencia", que contiene un aviso de copyright. Estas llamadas y la cadena de licencia se encuentran en el archivo de implementación de control (.CPP). El archivo de licencia, generado por el Asistente para controles ActiveX, es un archivo de texto con una declaración de copyright. Se denomina usando el nombre del proyecto y una extensión .LIC, por ejemplo, SAMPLE.LIC. Un control con licencia debe ir acompañado del archivo de licencia si es necesario utilizarlo en tiempo de diseño.
Creación de un control con licencia
Al usar el Asistente para controles ActiveX para crear el marco de control, es fácil incluir compatibilidad con licencias. Cuando se especifica que el control debe tener una licencia en tiempo de ejecución, el Asistente para controles ActiveX agrega código a la clase de control para admitir licencias. El código consta de funciones que usan una clave y un archivo de licencia para la comprobación de licencias. Estas funciones también se pueden modificar para personalizar las licencias de control. Para obtener más información sobre la personalización de licencias, consulte Personalización de las licencias de un control ActiveX más adelante en este artículo.
Para agregar compatibilidad con licencias con el Asistente para controles ActiveX al crear el proyecto de control
- Siga las instrucciones de Creación de un control ActiveX de MFC. La página Configuración de la aplicación del Asistente para controles ActiveX contiene la opción de crear el control con la licencia en tiempo de ejecución.
El Asistente para controles ActiveX ahora genera un marco de control ActiveX que incluye compatibilidad básica con licencias. Para obtener una explicación detallada del código de licencia, consulte el tema siguiente.
Soporte técnico para licencias
Cuando se usa el Asistente para controles ActiveX para agregar compatibilidad con licencias a un control ActiveX, se agrega código a los archivos de encabezado e implementación del control que declara e implementa la capacidad de licencia. Este código se compone de una VerifyUserLicense función miembro y una GetLicenseKey función miembro, que invalida las implementaciones predeterminadas que se encuentran en COleObjectFactory . Estas funciones recuperan y comprueban la licencia de control.
Nota:
Una tercera función miembro, VerifyLicenseKey no es generada por el Asistente de control ActiveX, pero puede ser anulada para personalizar el comportamiento de verificación de la clave de licencia.
Estas funciones de los miembros son:
-
Comprueba que el control permite el uso en tiempo de diseño comprobando en el sistema la presencia del archivo de licencia del control. El marco llama a esta función como parte del procesamiento
IClassFactory2::GetLicInfoyIClassFactory::CreateInstanceLic. -
Solicita una clave única desde el archivo DLL de control. Esta clave se inserta en la aplicación contenedora y se usa más adelante, junto con
VerifyLicenseKey, para crear una instancia del control. El framework llama a esta función como parte del procesamiento deIClassFactory2::RequestLicKey. -
Comprueba que la clave insertada y la clave única del control son las mismas. Esto permite al contenedor crear una instancia del control para su uso. El marco llama a esta función como parte del procesamiento
IClassFactory2::CreateInstanceLicy se puede invalidar para proporcionar una comprobación personalizada de la clave de licencia. La implementación predeterminada realiza una comparación de cadenas. Para obtener más información, consulte Personalización de las licencias de un control ActiveX, más adelante en este artículo.
Modificaciones del archivo de encabezado
El Asistente para controles ActiveX coloca el código siguiente en el archivo de encabezado de control. En este ejemplo, se declaran dos funciones miembro del objeto CSampleCtrlfactory: una que comprueba la presencia del archivo .LIC del control y otra que recupera la clave de licencia que se va a usar en la aplicación que contiene el control.
BEGIN_OLEFACTORY(CMyAxUICtrl) // Class factory and guid
virtual BOOL VerifyUserLicense();
virtual BOOL GetLicenseKey(DWORD, BSTR FAR*);
END_OLEFACTORY(CMyAxUICtrl)
Modificaciones del archivo de implementación
El Asistente para controles ActiveX coloca las dos instrucciones siguientes en el archivo de implementación de control para declarar el nombre de archivo de licencia y la cadena de licencia:
static const TCHAR BASED_CODE _szLicFileName[] = _T("NVC_MFC_AxUI.lic");
static const WCHAR BASED_CODE _szLicString[] = L"Copyright (c) 2006 ";
Nota:
Si modifica szLicString de alguna manera, también debe modificar la primera línea del archivo de control .LIC o la licencia no funcionará correctamente.
El Asistente para controles ActiveX coloca el código siguiente en el archivo de implementación de control para definir las funciones VerifyUserLicense y GetLicenseKey de la clase de control:
// CMyAxUICtrl::CMyAxUICtrlFactory::VerifyUserLicense -
// Checks for existence of a user license
BOOL CMyAxUICtrl::CMyAxUICtrlFactory::VerifyUserLicense()
{
return AfxVerifyLicFile(AfxGetInstanceHandle(), _szLicFileName, _szLicString);
}
// CMyAxUICtrl::CMyAxUICtrlFactory::GetLicenseKey -
// Returns a runtime licensing key
BOOL CMyAxUICtrl::CMyAxUICtrlFactory::GetLicenseKey(DWORD /*dwReserved*/,
BSTR FAR* pbstrKey)
{
if (pbstrKey == NULL)
return FALSE;
*pbstrKey = SysAllocString(_szLicString);
return (*pbstrKey != NULL);
}
Por último, el Asistente para controles ActiveX modifica el archivo .IDL del proyecto de control. La palabra clave licensed se agrega a la declaración de coclase del control, como en el ejemplo siguiente:
[uuid(913E450B-E720-4C71-BCDF-71C96EE98FEB), licensed,
helpstring("MyAxUI Control"), control]
coclass NVC_MFC_AxUI
Personalización de las licencias de un control ActiveX
Dado que VerifyUserLicense, GetLicenseKeyy VerifyLicenseKey se declaran como funciones miembro virtual de la clase generadora de controles, puede personalizar el comportamiento de licencias del control.
Por ejemplo, puede proporcionar varios niveles de licencia para el control anulando las funciones miembro VerifyUserLicense o VerifyLicenseKey. Dentro de esta función, puede ajustar qué propiedades o métodos se exponen al usuario según el nivel de licencia que detectó.
También puede agregar código a la VerifyLicenseKey función que proporciona un método personalizado para informar al usuario de que se ha producido un error en la creación del control. Por ejemplo, en sur VerifyLicenseKey función miembro podría mostrar un cuadro de mensaje indicando que ha ocurrido un error al intentar inicializar el control y por qué.
Nota:
Otra forma de personalizar la verificación de la licencia del control ActiveX es comprobar la base de datos de registro para una clave de registro específica, en lugar de llamar a AfxVerifyLicFile. Para obtener un ejemplo de la implementación predeterminada, consulte la sección Modificaciones del archivo de implementación de este artículo.
Para obtener más información sobre los problemas de licencias, consulte Problemas de licencias en actualización de un control ActiveX existente.
Consulte también
Controles ActiveX de MFC
Asistente para controles ActiveX de MFC