Controles MFC ActiveX: licenciando um controle ActiveX
O suporte de licenciamento, um recurso opcional dos controles ActiveX, permite controlar quem pode usar ou distribuir o controle. (Para uma discussão adicional sobre problemas de licenciamento, consulte Problemas de licenciamento em Atualização de um Controle ActiveX Existente.)
Importante
O ActiveX é uma tecnologia herdada que não deve ser usada para novo desenvolvimento. Para mais informações sobre tecnologias modernas que substituem o ActiveX, confira Controles do ActiveX.
Este artigo discute os seguintes tópicos:
Os controles ActiveX que implementam o licenciamento permitem que você, como desenvolvedor do controle, determine como outras pessoas usarão o controle ActiveX. Você fornece ao comprador do controle o controle e o arquivo .LIC, com o contrato de que o comprador pode distribuir o controle, mas não o arquivo .LIC, com um aplicativo que usa o controle. Isso impede que os usuários desse aplicativo gravem novos aplicativos que usam o controle, sem primeiro licenciar o controle de você.
Visão Geral do Licenciamento de Controle ActiveX
Para fornecer suporte de licenciamento para controles ActiveX, a classe COleObjectFactory fornece uma implementação para várias funções na interface IClassFactory2
: IClassFactory2::RequestLicKey
, IClassFactory2::GetLicInfo
e IClassFactory2::CreateInstanceLic
. Quando o desenvolvedor do aplicativo de contêiner faz uma solicitação para criar uma instância do controle, uma chamada para GetLicInfo
é feita para verificar se o arquivo .LIC do controle está presente. Se o controle estiver licenciado, uma instância do controle poderá ser criada e colocada no contêiner. Depois que o desenvolvedor terminar de construir o aplicativo contêiner, outra chamada de função, desta vez para RequestLicKey
, será feita. Essa função retorna uma chave de licença (uma cadeia de caracteres simples) para o aplicativo contêiner. A chave retornada é então inserida no aplicativo.
A figura abaixo demonstra a verificação de licença de um controle ActiveX que será utilizado durante o desenvolvimento de aplicativo de contêiner. Conforme mencionado anteriormente, o desenvolvedor do aplicativo de contêiner deve ter o arquivo .LIC apropriado instalado na máquina de desenvolvimento para criar uma instância do controle.
Verificação de um Controle ActiveX Licenciado durante o Desenvolvimento
O próximo processo, mostrado na figura a seguir, ocorre quando o usuário final executa o aplicativo de contêiner.
Quando o aplicativo é iniciado, uma instância do controle geralmente precisa ser criada. O contêiner faz isso fazendo uma chamada para CreateInstanceLic
, passando a chave de licença incorporada como parâmetro. Uma comparação de cadeia de caracteres é então feita entre a chave de licença incorporada e a própria cópia da chave de licença do controle. Se a correspondência for bem-sucedida, uma instância do controle será criada e o aplicativo continuará a ser executado normalmente. Observe que o arquivo .LIC não precisa estar presente na máquina do usuário de controle.
Verificação de um Controle ActiveX Licenciado durante a Execução
O licenciamento de controle consiste em dois componentes básicos: código específico na DLL de implementação de controle e o arquivo de licença. O código é composto por duas (ou possivelmente três) chamadas de função e uma sequência de caracteres, doravante denominada "sequência de licença", contendo um aviso de direitos autorais. Essas chamadas e a cadeia de caracteres de licença são encontradas no arquivo de implementação de controle (.CPP). O arquivo de licença, gerado pelo Assistente de Controle do ActiveX, é um arquivo de texto com uma declaração de direitos autorais. Ele é nomeado usando o nome do projeto com uma extensão .LIC, por exemplo SAMPLE.LIC. Um controle licenciado deve ser acompanhado pelo arquivo de licença se for necessário o uso em tempo de design.
Criação de um Controle Licenciado
Quando você usa o Assistente de Controle do ActiveX para criar a estrutura de controle, é fácil incluir suporte de licenciamento. Quando você especifica que o controle deve ter uma licença de tempo de execução, o Assistente de Controle do ActiveX adiciona código à classe de controle para dar suporte ao licenciamento. O código consiste em funções que usam uma chave e um arquivo de licença para verificação de licença. Essas funções também podem ser modificadas para personalizar o licenciamento de controle. Para obter mais informações sobre personalização de licenças, confira Personalizando o Licenciamento de um Controle ActiveX posteriormente neste artigo.
Para adicionar suporte para licenciamento com o Assistente de Controle do ActiveX ao criar seu projeto de controle
- Use as instruções em Criação de um Controle ActiveX MFC. A página Configurações do Aplicativo do Assistente de Controle do ActiveX contém a opção de criar o controle com a licença de tempo de execução.
O Assistente de Controle do ActiveX agora gera uma estrutura de controle ActiveX que inclui suporte básico de licenciamento. Para obter uma explicação detalhada do código de licenciamento, consulte o próximo tópico.
Suporte de licenciamento
Quando você usa o Assistente de Controle do ActiveX para adicionar suporte de licenciamento a um controle ActiveX, o assistente adiciona código que declara e implementa o recurso de licenciamento adicionado ao cabeçalho do controle e aos arquivos de implementação. Esse código é composto por uma função de membro VerifyUserLicense
e uma GetLicenseKey
, que substituem as implementações padrão encontradas em COleObjectFactory. Essas funções recuperam e verificam a licença de controle.
Observação
Uma terceira função de membro, VerifyLicenseKey
não é gerada pelo Assistente de Controle do ActiveX, mas pode ser substituída para personalizar o comportamento de verificação da chave de licença.
Essas funções de membro são:
-
Verifica se o controle permite o uso em tempo de design verificando no sistema a presença do arquivo de licença de controle. Esta função é chamada pela estrutura como parte do processamento
IClassFactory2::GetLicInfo
eIClassFactory::CreateInstanceLic
. -
Solicita uma chave exclusiva da DLL de controle. Essa chave é inserida no aplicativo de contêiner e usada posteriormente, em conjunto com
VerifyLicenseKey
, para criar uma instância do controle. Esta função é chamada pela estrutura como parte do processamentoIClassFactory2::RequestLicKey
. -
Verifica se a chave inserida e a chave exclusiva do controle são iguais. Isso permite que o contêiner crie uma instância do controle para seu uso. Essa função é chamada pela estrutura como parte do processamento
IClassFactory2::CreateInstanceLic
e pode ser substituída para fornecer verificação personalizada da chave de licença. A implementação padrão executa uma comparação de cadeia de caracteres. Para obter mais informações, confira Personalização do Licenciamento de um Controle ActiveX, mais adiante neste artigo.
Modificações de arquivo de cabeçalho
O Assistente de Controle do ActiveX coloca o seguinte código no arquivo de cabeçalho de controle. Neste exemplo, duas funções membro do objeto factory
de CSampleCtrl
são declaradas, uma que verifica a presença do arquivo .LIC de controle e outra que recupera a chave de licença a ser utilizada na aplicação que contém o controle:
BEGIN_OLEFACTORY(CMyAxUICtrl) // Class factory and guid
virtual BOOL VerifyUserLicense();
virtual BOOL GetLicenseKey(DWORD, BSTR FAR*);
END_OLEFACTORY(CMyAxUICtrl)
Modificações de Arquivo de Implementação
O Assistente de Controle do ActiveX coloca as duas instruções a seguir no arquivo de implementação de controle para declarar o nome do arquivo de licença e a cadeia de caracteres de licença:
static const TCHAR BASED_CODE _szLicFileName[] = _T("NVC_MFC_AxUI.lic");
static const WCHAR BASED_CODE _szLicString[] = L"Copyright (c) 2006 ";
Observação
Se você modificar szLicString
de alguma forma, também deverá modificar a primeira linha no arquivo .LIC de controle ou o licenciamento não funcionará corretamente.
O Assistente de Controle do ActiveX coloca o seguinte código no arquivo de implementação de controle para definir as funções VerifyUserLicense
e GetLicenseKey
da classe de controle:
// 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 fim, o Assistente de Controle do ActiveX modifica o arquivo .IDL do projeto de controle. A palavra-chave licensed é adicionada à declaração de coclass do controle, como no exemplo a seguir:
[uuid(913E450B-E720-4C71-BCDF-71C96EE98FEB), licensed,
helpstring("MyAxUI Control"), control]
coclass NVC_MFC_AxUI
Personalização do Licenciamento de um Controle do ActiveX
Como VerifyUserLicense
, GetLicenseKey
e VerifyLicenseKey
são declaradas como funções de membro virtual da classe de fábrica de controle, você pode personalizar o comportamento de licenciamento do controle.
Por exemplo, você pode fornecer vários níveis de licenciamento para o controle substituindo as funções de membro VerifyUserLicense
ou VerifyLicenseKey
. Dentro desta função você pode ajustar quais propriedades ou métodos são expostos ao usuário de acordo com o nível de licença detectado.
Você também pode adicionar código à função VerifyLicenseKey
que fornece um método personalizado para informar ao usuário que a criação do controle falhou. Por exemplo, em sua função de membro VerifyLicenseKey
, você pode exibir uma caixa de mensagem informando que o controle falhou ao inicializar e por quê.
Observação
Outra maneira de personalizar a verificação de licença de controle ActiveX é verificar no banco de dados de registro uma chave de registro específica, em vez de chamar AfxVerifyLicFile
. Para obter um exemplo da implementação padrão, confira a seção Modificações do Arquivo de Implementação deste artigo.
Para obter mais discussões sobre problemas de licenciamento, consulte Problemas de licenciamento em Atualização de um Controle ActiveX Existente.
Confira também
Controles ActiveX do MFC
Assistente de controle ActiveX do MFC