Licenciamento e IClassFactory2
A interface IClassFactory em um objeto de classe fornece o mecanismo básico de criação de objeto de COM. Usando IClassFactory, um servidor pode controlar a criação de objetos com base na máquina. A implementação do método IClassFactory::CreateInstance pode permitir ou não a criação de objetos com base na existência de uma licença de máquina. Uma licença de máquina é uma informação separada do aplicativo que existe em uma máquina para indicar que o software foi instalado a partir de uma fonte válida, como os discos de instalação do fornecedor. Se a licença da máquina não existir, o servidor poderá não permitir a criação de objetos. O licenciamento de máquina impede a pirataria nos casos em que um usuário tenta copiar o software de uma máquina para outra, porque as informações de licença não são copiadas com o software e a máquina que recebe a cópia não é licenciada.
No entanto, em um setor de software de componentes, os fornecedores precisam de um nível mais fino de controle sobre o licenciamento. Além do controle de licença de máquina, um fornecedor precisa permitir que alguns clientes criem um objeto de componente enquanto negam a outros clientes o mesmo recurso. Isso requer que o aplicativo cliente obtenha uma chave de licença do componente enquanto o aplicativo cliente ainda está em desenvolvimento. O aplicativo cliente usa a chave de licença em tempo de execução para criar objetos em uma máquina não licenciada.
Por exemplo, se um fornecedor fornecer uma biblioteca de controles aos desenvolvedores, o desenvolvedor que comprar a biblioteca terá uma licença de máquina completa, permitindo que os objetos sejam criados na máquina de desenvolvimento. O desenvolvedor pode então criar um aplicativo cliente na máquina licenciada incorporando um ou mais dos controles. Quando o aplicativo cliente resultante é executado em outra máquina, os controles usados no aplicativo cliente devem ser criados na outra máquina, mesmo que essa máquina não possua uma licença de máquina para os controles do fornecedor original.
A interface IClassFactory2 fornece esse nível de controle. Para permitir o licenciamento baseado em chave para qualquer componente específico, implemente IClassFactory2 no objeto de fábrica de classe para esse componente. IClassFactory2 é derivado de IClassFactory, portanto, ao implementar IClassFactory2, o objeto de fábrica de classe atende aos requisitos básicos de COM.
Para incorporar um componente licenciado em seu aplicativo cliente, use os seguintes métodos em IClassFactory2:
- O método GetLicInfo preenche uma estrutura LICINFO com informações que descrevem o comportamento de licenciamento da fábrica de classes. Por exemplo, a fábrica de classes pode fornecer chaves de licença para licenciamento em tempo de execução se o membro fRunTimeKeyAvail for TRUE.
- O método RequestLicKey fornece uma chave de licença para o componente. Uma licença de máquina deve estar disponível quando o cliente chama esse método.
- O método CreateInstanceLic cria uma instância do componente licenciado se o parâmetro de chave de licença (BSTRÂ bstrKey) for válido.
Observação
Em suas informações de tipo, um componente usa o atributo licensed para marcar a coclasse que oferece suporte ao licenciamento por meio de IClassFactory2.
Primeiro, você precisa de uma ferramenta de desenvolvimento separada que também seja um cliente do componente licenciado. O objetivo dessa ferramenta é obter a chave de licença de tempo de execução e salvá-la em seu aplicativo cliente. Esta ferramenta é executada apenas em uma máquina que possui uma licença de máquina para o componente. A ferramenta chama os métodos GetLicInfo e RequestLicKey para obter a chave de licença de tempo de execução e, em seguida, salva a chave de licença em seu aplicativo cliente. Por exemplo, a ferramenta de desenvolvimento poderia criar um arquivo de cabeçalho (.h) contendo a chave de licença BSTR e, em seguida, você incluiria esse arquivo .h em seu aplicativo cliente.
Para instanciar o componente em seu aplicativo cliente, primeiro tente instanciar o objeto diretamente com IClassFactory::CreateInstance. Se CreateInstance for bem-sucedido, a segunda máquina será licenciada para o componente e os objetos poderão ser criados à vontade. Se CreateInstance falhar com o código de retorno CLASS_E_NOTLICENSED, a única maneira de criar o objeto é passar a chave de tempo de execução para o método CreateInstanceLic. CreateInstanceLic verifica a chave e cria o objeto se a chave for válida.
Dessa forma, um aplicativo criado com componentes (como controles) pode ser executado em uma máquina que não tem outra licença — somente o aplicativo cliente que contém a licença de tempo de execução tem permissão para criar os objetos de componente em questão.
A interface IClassFactory2 suporta flexibilidade em esquemas de licenciamento. Por exemplo, o implementador de servidor pode criptografar chaves de licença no componente para maior segurança. Os implementadores de servidor também podem habilitar ou desabilitar níveis de funcionalidade em seus objetos fornecendo chaves de licença diferentes para funções diferentes. Por exemplo, uma chave pode permitir um nível básico de funcionalidade, enquanto outra permite funcionalidade básica e avançada, e assim por diante.
Tópicos relacionados