Compartir a través de


Controles ActiveX MFC: Licencias de un control ActiveX

El soporte técnico de licencias, una característica opcional de los controles ActiveX, le permite controlar quién puede utilizar o distribuir el control. (para obtener más información sobre los problemas de licencia, consulte Problemas de licencias en la Actualización de un control ActiveX existente).

Importante

ActiveX es una tecnología heredada que no se debe usar para el nuevo desarrollo. Para más información sobre las tecnologías modernas que reemplazan a ActiveX, vea Controles ActiveX.

En este artículo se tratan los temas siguientes:

Los controles ActiveX que implementan licencias le permiten a usted, como desarrollador del control, determinar la forma en que otras personas utilizarán el control ActiveX. Usted proporciona 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 utilice el control. Esto evita que los usuarios de esa aplicación escriban nuevas aplicaciones que usen el control, sin que usted les otorgue primero la licencia del control.

Visión general de las licencias de los controles ActiveX

Para proporcionar soporte de licencias para los controles ActiveX, la clase COleObjectFactory proporciona una implementación para varias funciones de la IClassFactory2 interfaz: IClassFactory2::RequestLicKey, IClassFactory2::GetLicInfo, y IClassFactory2::CreateInstanceLic. Cuando el desarrollador de la aplicación del contenedor hace una solicitud para crear una instancia del control, se hace una llamada a GetLicInfo para verificar que el archivo .LIC del control está presente. Si el control tiene licencia, se puede crear una instancia del control y colocarla en el contenedor. Luego de que el desarrollador haya terminado de construir la aplicación del contenedor, se realiza otra llamada a la función, esta vez a RequestLicKey. Esta función devuelve una clave de licencia (una simple cadena de caracteres) a la aplicación contenedora. La clave devuelta se incrusta en la aplicación.

La siguiente figura muestra la verificación de la licencia de un control ActiveX que se utilizará durante el desarrollo de una aplicación de contenedor. Como se mencionó anteriormente, el desarrollador de aplicaciones de contenedores debe tener el archivo .LIC adecuado instalado en la máquina de desarrollo para crear una instancia del control.

Licensed ActiveX control verified at development.
Comprobación de un control ActiveX con licencia durante el desarrollo

El siguiente proceso, mostrado en la siguiente figura, se produce cuando el usuario final ejecuta la aplicación del contenedor.

Cuando se inicia la aplicación, normalmente hay que crear una instancia del control. El contenedor logra esto haciendo 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 de la clave de licencia del control. 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 no es necesario que el archivo .LIC esté presente en la máquina del usuario de control.

Licensed ActiveX control verified at execution.
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 la DLL de implementación de control y el archivo de licencia. El código se compone de dos (o posiblemente tres) llamadas de función y una cadena de caracteres, en adelante 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 de control ActiveX, es un archivo de texto con una declaración de copyright. Se denomina utilizando el nombre del proyecto con 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

Cuando se usa el Asistente de control ActiveX para crear el marco de control, es fácil incluir el soporte de licencias. Cuando se especifica que el control debe tener una licencia de tiempo de ejecución, el Asistente de control ActiveX agrega código a la clase de control para el soporte técnico de las licencias. El código consiste en funciones que utilizan una clave y un archivo de licencia para la verificación de la misma. Estas funciones también pueden modificarse para personalizar la licencia de control. Para obtener más información sobre la personalización de la licencia, consulte Personalización de la licencia de un control ActiveX más adelante en este artículo.

Para agregar la compatibilidad con las licencias con el Asistente para el control de ActiveX al crear el proyecto de control

  1. Utilice las instrucciones en Creación de un control ActiveX MFC. La página de Configuración de la aplicación del asistente de control ActiveX contiene la opción de crear el control con la licencia de ejecución.

El Asistente de control ActiveX genera ahora un marco de control ActiveX que incluye soporte básico de licencias. Para una explicación detallada del código de licencia, consulte el siguiente tema.

Soporte técnico para licencias

Cuando se utiliza el Asistente para el control de ActiveX para agregar compatibilidad con licencias a un control de ActiveX, el Asistente para el control de ActiveX agrega el código que declara e implementa la capacidad de concesión de licencias se agrega a los archivos de cabecera e implementación del control. Este código se compone de una VerifyUserLicense función miembro y una GetLicenseKey función miembro, que anulan las implementaciones predeterminadas que se encuentran en COleObjectFactory . Estas funciones recuperan y verifican 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:

  • VerifyUserLicense

    Comprueba que el control permite el uso en tiempo de diseño comprobando en el sistema la presencia del archivo de licencia del control. Esta función es llamada por el marco como parte del procesamiento IClassFactory2::GetLicInfo y IClassFactory::CreateInstanceLic.

  • GetLicenseKey

    Solicita una clave única a la DLL del control. Esta clave se incrusta en la aplicación del contenedor y se utiliza posteriormente, junto con VerifyLicenseKey, para crear una instancia del control. Esta función es llamada por el marco como parte del procesamiento IClassFactory2::RequestLicKey.

  • VerifyLicenseKey

    Comprueba que la clave incrustada y la clave única del control son las mismas. Esto permite al contenedor crear una instancia del control para su uso. Esta función es llamada por el marco como parte del procesamiento IClassFactory2::CreateInstanceLic y puede ser anulada para proporcionar una verificació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 de control ActiveX coloca el siguiente código en el archivo de encabezado del control. En este ejemplo, se declaran dos funciones miembro del objetoCSampleCtrl factory, una que verifica la presencia del archivo .LIC del control y otra que recupera la clave de licencia que se utilizará 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 de control ActiveX coloca las siguientes dos declaraciones en el archivo de implementación del control para declarar el nombre del 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 lo 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 de control ActiveX coloca el siguiente código en el archivo de implementación del control para definir la clase VerifyUserLicense y GetLicenseKey las funciones del 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);
}

Finalmente, el Asistente de control ActiveX modifica el archivo .IDL del proyecto de control. La palabra clave Con licencia se agrega a la declaración de la coclase del control, como en el siguiente ejemplo:

[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, GetLicenseKey, y VerifyLicenseKey se declaran como funciones miembro virtuales de la clase de fábrica del control, puede personalizar el comportamiento de la licencia 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 podrá ajustar qué propiedades o métodos se exponen al usuario según el nivel de licencia que haya detectado.

También puede agregar código a la VerifyLicenseKey función que proporciona un método personalizado para informar al usuario de que la creación del control ha fallado. 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 ver 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 licencia, consulte Problemas de licencia en la actualización de un control ActiveX existente.

Consulte también

Controles ActiveX de MFC
Asistente para controles ActiveX MFC