0
授权支持是 ActiveX 控件的一项可选功能,它使您得以控制能使用或分发该控件的人。(有关授权问题的其他讨论,请参见升级现有的 ActiveX 控件中的“授权问题”。) 本文讨论下面的主题: •ActiveX 控件授权概述 •创建授权的控件 •授权支持 •自定义 ActiveX 控件的授权 实现授权的 ActiveX 控件使您得以作为控件开发人员决定其他人可以如何使用 ActiveX 控件。向控件购买者提供控件和 .LIC 文件,提供购买者可以分发控件但不能分发 .LIC 文件的协议,和提供使用此控件的应用程序。这可防止该应用程序的用户在没有事先得到您的控件授权的情况下,编写使用该控件的新应用程序。 ActiveX 控件授权概述 若要对 ActiveX 控件提供授权支持,COleObjectFactory 类需要提供 IClassFactory2 接口中的几个函数(IClassFactory2::RequestLicKey、IClassFactory2::GetLicInfo 和 IClassFactory2::CreateInstanceLic)的实现。当容器应用程序的开发人员请求创建控件实例时,将调用 GetLicInfo 验证控件 .LIC 文件是否存在。如果控件已授权,则可以创建该控件的实例,并将其放置在容器中。开发人员构造此容器应用程序后,将调用另一个函数(这次调用的是 RequestLicKey)。该函数将许可证密钥(一个简单的字符串)返回该容器应用程序。返回的密钥随后被嵌入到该应用程序中。 下图说明 ActiveX 控件的授权验证,此授权验证将在开发容器应用程序期间使用。如前面提到的那样,容器应用程序的开发人员必须已将正确的 .LIC 文件安装在开发计算机上,以创建该控件的实例。 开发期间授权的 ActiveX 控件的验证 下一个过程(如下图所示)在最终用户运行容器应用程序时发生。 启动该应用程序时,通常需要创建该控件的实例。该容器通过调用 CreateInstanceLic 并将嵌入的许可证密钥作为参数传递来创建该实例。然后在嵌入的许可证密钥与控件自己的许可证密钥副本之间进行字符串比较。如果匹配成功,则创建该控件实例,并且应用程序继续正常地执行。请注意,控件用户的计算机上不需要有 LIC 文件。 执行期间授权的 ActiveX 控件的验证 控件授权包含两个基本组件:控件实现 DLL 中的特定代码和许可文件。该代码由两个(也可能是三个)函数调用和一个字符串组成,此字符串在后面称为“许可字符串”,它包含了版权声明。这些调用和许可字符串位于控件实现 (.CPP) 文件中。许可文件由“ActiveX 控件向导”生成,它是包含版权声明的文本文件。许可文件由项目名称和 .LIC 扩展名命名,如 SAMPLE.LIC。如果需要在设计时使用,则授权的控件必须附带有许可文件。 创建授权的控件 在使用“ActiveX 控件向导”创建控件框架时,可以轻松包括授权支持。当您指定控件应具有运行时授权时,“ActiveX 控件向导”会在控件类中添加支持授权的代码。此代码由使用密钥和验证授权用的许可文件的函数组成。还可以修改这些函数来自定义控件授权。有关授权自定义的更多信息,请参见本文后面的自定义 ActiveX 控件的授权。 创建控件项目时用“ActiveX 控件向导”添加授权支持 •使用创建 MFC ActiveX 控件中的说明。“ActiveX 控件向导”的“应用程序设置”页包含创建具有运行时授权的控件的选项。 “ActiveX 控件向导”现在生成了一个包括基本授权支持的 ActiveX 控件框架。有关该授权代码的详细说明,请参见下一个主题。 授权支持 当使用“ActiveX 控件向导”向 ActiveX 控件添加授权支持时,“ActiveX 控件向导”添加代码,以声明并实现添加到控件头文件和实现文件的授权功能。此代码由 VerifyUserLicense 成员函数和 GetLicenseKey 成员函数组成,这两个函数重写 COleObjectFactory 中的默认实现。这两个函数检索并验证控件授权。 注意 第三个成员函数 VerifyLicenseKey 不是由“ActiveX 控件向导”生成的,但可以重写此函数以自定义许可证密钥验证行为。 这些成员函数是: •VerifyUserLicense 该函数通过检查系统中是否存在控件许可文件,验证控件是否允许设计时使用。该函数由框架调用,作为处理 IClassFactory2::GetLicInfo 和 IClassFactory::CreateInstanceLic 的一部分。 •GetLicenseKey 该函数从控件 DLL 请求唯一密钥。此密钥嵌入容器应用程序中,稍后将与 VerifyLicenseKey 函数一起用来创建控件实例。该函数由框架调用,作为处理 IClassFactory2::RequestLicKey 的一部分。 •VerifyLicenseKey 该函数验证嵌入的密钥与控件的唯一密钥是否相同。这使容器得以创建控件实例供其使用。该函数由框架调用,作为处理 IClassFactory2::CreateInstanceLic 的一部分,并可以重写以提供许可证密钥的自定义验证。默认实现执行字符串比较。有关更多信息,请参见本文后面的自定义 ActiveX 控件的授权。 头文件的修改 “ActiveX 控件向导”将下列代码放置在控件头文件中。在本示例中,声明了 CSampleCtrl 的 factory 对象的两个成员函数,其中一个成员函数验证控件 .LIC 文件是否存在,而另一个成员函数则对包含该控件的应用程序中使用的许可证密钥进行检索: 复制 BEGIN_OLEFACTORY(CSampleCtrl) // Class factory and guid virtual BOOL VerifyUserLicense(); virtual BOOL GetLicenseKey(DWORD, BSTR FAR*); END_OLEFACTORY(CSampleCtrl) 实现文件的修改 “ActiveX 控件向导”将下面两条语句放置在控件实现文件中,以声明许可文件名和许可字符串: 复制 static const TCHAR BASED_CODE _szLicFileName[] = _T("License.lic"); static const WCHAR BASED_CODE _szLicString[] = L"Copyright (c) 2000 "; 注意 如果以任何方式修改 szLicString,则必须也修改控件 .LIC 文件的第一行,否则授权将无法正确运行。 “ActiveX 控件向导”将下列代码放置在控件实现文件中,以定义控件类的 VerifyUserLicense 函数和 GetLicenseKey 函数: 复制 ///////////////////////////////////////////////////////////////////////////// // CLicenseCtrl::CLicenseCtrlFactory::VerifyUserLicense // Checks for existence of a user license BOOL CLicenseCtrl::CLicenseCtrlFactory::VerifyUserLicense() { return AfxVerifyLicFile(AfxGetInstanceHandle(), _szLicFileName, _szLicString); } ///////////////////////////////////////////////////////////////////////////// // CLicenseCtrl::CLicenseCtrlFactory::GetLicenseKey - // Returns a runtime licensing key BOOL CLicenseCtrl::CLicenseCtrlFactory::GetLicenseKey(DWORD dwReserved, BSTR FAR* pbstrKey) { if (pbstrKey == NULL) return FALSE; *pbstrKey = SysAllocString(_szLicString); return (*pbstrKey != NULL); } 最后,“ActiveX 控件向导”修改控件项目 .IDL 文件。将关键字 licensed 添加到控件的 coclass 声明中,如下例所示: 复制 [ uuid(EF365BF1-5D4C-11D2-875A-00600893AFE8), licensed, helpstring("Sample Control"), control ] coclass Sample2 自定义 ActiveX 控件的授权 VerifyUserLicense、GetLicenseKey 和 VerifyLicenseKey 已声明为控件工厂类的虚拟成员函数,因此可以自定义控件的授权行为。 例如,通过重写 VerifyUserLicense 或 VerifyLicenseKey 成员函数,可以为控件提供几种授权级别。在该函数中,可以根据检测到的授权级别调整向用户公开的属性或方法。 也可以向 VerifyLicenseKey 函数添加代码,而此函数提供通知用户创建控件已失败的自定义方法。例如,在 VerifyLicenseKey 成员函数中可以显示一个消息框,指明控件初始化失败及失败的原因。 注意 另一个自定义 ActiveX 控件授权验证的方法是检查注册数据库中是否包含某个特定的注册表项,而不是调用 AfxVerifyLicFile。有关默认实现的示例,请参见本文的实现文件的修改节。 有关授权问题的其他讨论,请参见升级现有的 ActiveX 控件中的“授权问题”。 http://msdn.microsoft.com/zh-cn/library/cc451429(VS.71).aspx
关闭 返回顶部
联系我们
Copyright © 2011. 聚财吧. All rights reserved.