Licenciamento e IClassFactory2
O IClassFactory interface em um objeto de classe fornece o mecanismo de criação de objeto básico de COM. Usando IClassFactory, um servidor pode controlar a criação de objetos em uma base de 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 pode 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 uma indústria 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 nega a outros clientes a mesma capacidade. 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 para 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, implemente IClassFactory2 no objeto de fábrica de classe para esse componente. IClassFactory2 é derivado de IClassFactory, portanto, implementando 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 no IClassFactory2:
- O método GetLicInfo preenche uma estrutura LICINFO com informações que descrevem o comportamento de licenciamento da classe fábrica. Por exemplo, a fábrica de classes pode proporcionar 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 da chave de licença (BSTRÂ bstrKey) for válido.
Observação
Em suas informações de tipo, um componente usa o atributo licenciado para marcar a coclasse que suporta o licenciamento por meio IClassFactory2.
Primeiro, você precisa de uma ferramenta de desenvolvimento separada que também seja um cliente do componente licenciado. O objetivo desta ferramenta é obter a chave de licença em 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 no 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 executado com sucesso, a segunda máquina será licenciada para o componente e os objetos poderão ser criados sem restrições. Se CreateInstance falhar com o código de retorno CLASS_E_NOTLICENSED, a única maneira de criar o objeto é fornecer a chave de execução ao 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 — apenas o aplicativo cliente que contém a licença em tempo de execução tem permissão para criar os objetos de componente em questão.
A interface IClassFactory2 suporta esquemas de licenciamento flexíveis. 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 diferentes funções. 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