Licencias e IClassFactory2
La interfaz IClassFactory de un objeto de clase proporciona el mecanismo básico de creación de objetos COM. Con IClassFactory, un servidor puede controlar la creación de objetos en una máquina. La implementación del método IClassFactory::CreateInstance puede permitir o denegar la creación de objetos en función de la existencia de una licencia de máquina. Una licencia de máquina es un fragmento de información independiente de la aplicación que existe en un equipo para indicar que el software se instaló desde un origen válido, como los discos de instalación del proveedor. Si la licencia de la máquina no existe, el servidor puede impedir la creación de objetos. Las licencias de máquina impiden la piratería en los casos en los que un usuario intenta copiar el software de una máquina a otra, ya que la información de licencia no se copia con el software y la máquina que recibe la copia no tiene licencia.
Sin embargo, en un sector de software de componentes, los proveedores necesitan un nivel más preciso de control sobre las licencias. Además del control de licencias de máquina, un proveedor debe permitir que algunos clientes creen un objeto de componente al denegar a otros clientes la misma funcionalidad. Esto requiere que la aplicación cliente obtenga una clave de licencia del componente mientras la aplicación cliente todavía está en desarrollo. La aplicación cliente usa la clave de licencia en tiempo de ejecución para crear objetos en un equipo sin licencia.
Por ejemplo, si un proveedor proporciona una biblioteca de controles a los desarrolladores, el desarrollador que compra la biblioteca tendrá una licencia de máquina completa, lo que permite crear los objetos en el equipo de desarrollo. A continuación, el desarrollador puede compilar una aplicación cliente en el equipo con licencia que incorpora uno o varios de los controles. Cuando la aplicación cliente resultante se ejecuta en otra máquina, los controles usados en la aplicación cliente deben crearse en el otro equipo, incluso si esa máquina no posee una licencia de máquina para los controles del proveedor original.
La interfaz IClassFactory2 proporciona este nivel de control. Para permitir licencias basadas en claves para cualquier componente determinado, implemente IClassFactory2 en el objeto de generador de clases para ese componente. IClassFactory2se deriva de IClassFactory, por lo que al implementar IClassFactory2, el objeto de generador de clases cumple los requisitos COM básicos.
Para incorporar un componente con licencia en la aplicación cliente, use los métodos siguientes en IClassFactory2:
- El método GetLicInfo rellena una estructura LICINFO con información que describe el comportamiento de licencia del generador de clases. Por ejemplo, el generador de clases puede proporcionar claves de licencia para licencias en tiempo de ejecución si el miembro fRunTimeKeyAvail es TRUE.
- El método RequestLicKey proporciona una clave de licencia para el componente. Una licencia de máquina debe estar disponible cuando el cliente llama a este método.
- El método CreateInstanceLic crea una instancia del componente con licencia si el parámetro de clave de licencia (BSTRÂ bstrKey) es válido.
Nota
En su información de tipo, un componente usa el atributo con licencia para marcar la coclase que admite licencias a través de IClassFactory2.
En primer lugar, necesita una herramienta de desarrollo independiente que también sea un cliente del componente con licencia. El propósito de esta herramienta es obtener la clave de licencia en tiempo de ejecución y guardarla en la aplicación cliente. Esta herramienta solo se ejecuta en una máquina que posee una licencia de máquina para el componente. La herramienta llama a los métodos GetLicInfo y RequestLicKey para obtener la clave de licencia en tiempo de ejecución y, a continuación, guarda la clave de licencia en la aplicación cliente. Por ejemplo, la herramienta de desarrollo podría crear un archivo de encabezado (.h) que contenga la clave de licencia BSTR y, a continuación, incluiría ese archivo .h en la aplicación cliente.
Para crear una instancia del componente dentro de la aplicación cliente, primero intente crear una instancia del objeto directamente con IClassFactory::CreateInstance. Si CreateInstance se realiza correctamente, la segunda máquina tiene licencia para el componente y los objetos se pueden crear a voluntad. Si se produce un error en CreateInstancecon el código de retorno CLASS_E_NOTLICENSED, la única manera de crear el objeto es pasar la clave en tiempo de ejecución al método CreateInstanceLic . CreateInstanceLic comprueba la clave y crea el objeto si la clave es válida.
De este modo, una aplicación compilada con componentes (como controles) se puede ejecutar en un equipo que no tenga ninguna otra licencia; solo la aplicación cliente que contiene la licencia en tiempo de ejecución puede crear los objetos de componente en cuestión.
La interfaz IClassFactory2 admite flexibilidad en los esquemas de licencias. Por ejemplo, el implementador de servidor puede cifrar las claves de licencia en el componente para mayor seguridad. Los implementadores de servidor también pueden habilitar o deshabilitar niveles de funcionalidad en sus objetos proporcionando claves de licencia diferentes para diferentes funciones. Por ejemplo, una clave podría permitir un nivel base de funcionalidad, mientras que otra permite funcionalidad básica y avanzada, etc.
Temas relacionados