MFC ActiveX 控件:授权 ActiveX 控件

许可支持是 ActiveX 控件的可选功能,可用于控制谁能够使用或分发控件。 (有关许可问题的其他讨论,请参阅 升级现有 ActiveX 控件中的许可问题。

重要

ActiveX 是一项不推荐用于新开发的旧技术。 有关取代 ActiveX 的新式技术的详细信息,请参阅 ActiveX 控件

本文讨论以下主题:

通过实现许可的 ActiveX 控件,作为控制开发人员,可以确定其他人如何使用 ActiveX 控件。 你向控件购买者提供控件和 。LIC 文件,与购买者可以分发控件的协议,但不能分发。LIC 文件,其中包含使用该控件的应用程序。 这样可以防止该应用程序的用户编写使用该控件的新应用程序,而无需首先向你授权该控件。

ActiveX 控制许可概述

为了为 ActiveX 控件提供许可支持,COleObjectFactory 类为接口中的IClassFactory2多个函数提供实现:IClassFactory2::RequestLicKeyIClassFactory2::GetLicInfoIClassFactory2::CreateInstanceLic。 当容器应用程序开发人员发出创建控件实例的请求时,将调用 GetLicInfo 以验证控件。LIC 文件存在。 如果控件获得许可,则可以创建控件的实例并将其放置在容器中。 在开发人员完成容器应用程序的构造后,将进行另一个函数调用(这次调用 RequestLicKey)。 此函数将许可证密钥(简单字符串)返回到容器应用程序。 然后,返回的密钥将嵌入到应用程序中。

下图演示了在开发容器应用程序期间将使用的 ActiveX 控件的许可证验证。 如前所述,容器应用程序开发人员必须具有正确的方法。安装在开发计算机上以创建控件实例的 LIC 文件。

开发时验证的已授权 ActiveX 控件。
在开发过程中验证许可的 ActiveX 控件

下图所示的下一个过程在最终用户运行容器应用程序时发生。

启动应用程序时,通常需要创建控件的实例。 容器通过调用 CreateInstanceLic将嵌入式许可证密钥作为参数传递来实现此目的。 然后,在嵌入式许可证密钥与控件自己的许可证密钥副本之间进行字符串比较。 如果匹配成功,则会创建控件的实例,应用程序将继续正常执行。 请注意,.控件用户的计算机上不需要存在 LIC 文件。

在执行时验证的已授权 ActiveX 控件。
在执行期间验证已授权的 ActiveX 控件

控制许可由两个基本组件组成:控制实现 DLL 和许可证文件中的特定代码。 代码由两个(或可能三个)函数调用和一个字符串组成,后称为“许可证字符串”,其中包含版权声明。 这些调用和许可证字符串位于控制实现中()。CPP) 文件。 由 ActiveX 控件向导生成的许可证文件是带有版权声明的文本文件。 它使用项目名称与一个 .LIC 扩展,例如 SAMPLE。LIC。 如果需要设计时使用,许可证文件必须附带许可的控制。

创建许可控件

使用 ActiveX 控件向导创建控件框架时,可以轻松包括许可支持。 当指定控件应具有运行时许可证时,ActiveX 控件向导会将代码添加到控件类以支持许可。 代码由使用密钥和许可证文件进行许可证验证的函数组成。 还可以修改这些函数以自定义控制许可。 有关许可证自定义的详细信息,请参阅本文后面的 ActiveX 控件的许可

在创建控件项目时添加对 ActiveX 控件向导许可的支持

  1. 使用 创建 MFC ActiveX 控件中的说明。 ActiveX 控件向导的应用程序 设置 页包含使用运行时许可证创建控件的选项。

ActiveX 控件向导现在生成包含基本许可支持的 ActiveX 控件框架。 有关许可代码的详细说明,请参阅下一主题。

许可支持

使用 ActiveX 控件向导向 ActiveX 控件添加许可支持时,ActiveX 控件向导会添加用于声明和实现许可功能的代码添加到控件标头和实现文件。 此代码由 VerifyUserLicense 成员函数和 GetLicenseKey 成员函数组成,该函数替代 在 COleObjectFactory 中找到的默认实现。 这些函数检索并验证控制许可证。

注释

第三个成员函数 VerifyLicenseKey 不是由 ActiveX 控件向导生成的,但可以重写以自定义许可证密钥验证行为。

这些成员函数包括:

  • VerifyUserLicense

    通过检查系统是否存在控制许可证文件,验证控件是否允许设计时使用。 此函数由框架调用,作为处理 IClassFactory2::GetLicInfoIClassFactory::CreateInstanceLic.

  • GetLicenseKey

    从控件 DLL 请求唯一键。 此密钥嵌入到容器应用程序中,稍后会与该密钥结合使用 VerifyLicenseKey来创建控件的实例。 此函数由框架作为处理的 IClassFactory2::RequestLicKey一部分调用。

  • VerifyLicenseKey

    验证嵌入键和控件的唯一键是否相同。 这样容器就可以创建控件的实例供其使用。 此函数由框架作为处理的 IClassFactory2::CreateInstanceLic 一部分调用,可以重写以提供对许可证密钥的自定义验证。 默认实现执行字符串比较。 有关详细信息,请参阅本文后面的 自定义 ActiveX 控件的许可

头文件修改

ActiveX 控件向导将以下代码置于控件头文件中。 在此示例中,声明了 's 对象的factory两个成员函数CSampleCtrl,一个用于验证控件是否存在。LIC 文件和另一个检索在包含控件的应用程序中使用的许可证密钥:

BEGIN_OLEFACTORY(CMyAxUICtrl)        // Class factory and guid
   virtual BOOL VerifyUserLicense();
virtual BOOL GetLicenseKey(DWORD, BSTR FAR*);
END_OLEFACTORY(CMyAxUICtrl)

实现文件修改

ActiveX 控件向导在控件实现文件中放置以下两个语句来声明许可证文件名和许可证字符串:

static const TCHAR BASED_CODE _szLicFileName[] = _T("NVC_MFC_AxUI.lic");

static const WCHAR BASED_CODE _szLicString[] = L"Copyright (c) 2006 ";

注释

如果以任何方式修改 szLicString ,则还必须修改控件中的第一行。LIC 文件或许可将无法正常工作。

ActiveX 控件向导将以下代码放在控件实现文件中,以定义控件类 VerifyUserLicenseGetLicenseKey 函数:

// 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);
}

最后, ActiveX 控件向导 将修改控件项目。IDL 文件。 许可关键字将添加到控件的 coclass 声明中,如以下示例所示:

[uuid(913E450B-E720-4C71-BCDF-71C96EE98FEB), licensed,
helpstring("MyAxUI Control"), control]
coclass NVC_MFC_AxUI

自定义 ActiveX 控件的许可

由于 VerifyUserLicenseGetLicenseKey并且 VerifyLicenseKey 声明为控件工厂类的虚拟成员函数,因此可以自定义控件的许可行为。

例如,可以通过重写 VerifyUserLicenseVerifyLicenseKey 成员函数为控件提供多个级别的许可。 在此函数中,可以根据检测到的许可证级别调整向用户公开哪些属性或方法。

还可以向函数添加代码 VerifyLicenseKey ,该函数提供自定义方法,用于通知用户控件创建失败。 例如,在成员函数中 VerifyLicenseKey ,可以显示一个消息框,指出控件无法初始化以及原因。

注释

自定义 ActiveX 控制许可证验证的另一种方法是检查特定注册表项的注册数据库,而不是调用 AfxVerifyLicFile。 有关默认实现的示例,请参阅本文的 “实现文件修改 ”部分。

有关许可问题的其他讨论,请参阅 升级现有 ActiveX 控件中的许可问题。

另请参阅

MFC ActiveX 控件
MFC ActiveX 控件向导