MFC ActiveX 控件:允许 ActiveX 控件
允许支持, 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 控件向导,但是,可以重写自定义许可证密钥验证行为。
这些成员函数是:
-
验证控件将检查系统允许设计时使用控件许可证文件的显示。 作为进程 IClassFactory2::GetLicInfo 和 IClassFactory::CreateInstanceLic一部分,此函数由框架调用。
-
请求从控件 DLL 的唯一键。 此密钥。容器应用程序嵌入并将 VerifyLicenseKey结合使用,后,创建控件的实例。 作为进程 IClassFactory2::RequestLicKey一部分,此函数由框架调用。
-
验证嵌入键和控件的唯一键相同。 这允许容器创建控件的实例为其用法。 此函数由框架调用作为进程 IClassFactory2::CreateInstanceLic 一部分,而且可以重写提供许可证密钥的自定义的验证。 默认实现执行字符串比较。 有关更多信息,请参见 自定义允许 Activex 控件,本文后面的
头文件修改
Activex 控件向导在控件头文件放置以下代码。 在此示例中, entity_CODECSampleCtrl 的对象 factory 的两个成员函数声明,验证控件名为 .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 控件向导在控件实现文件放置以下代码定义控件类的 VerifyUserLicense 和 GetLicenseKey 功能:
// 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 Control Wizard 修改控件项目 .IDL 文件。 licensed 关键字添加到控件的 coclass 声明,如下例所示:
[ uuid(913E450B-E720-4C71-BCDF-71C96EE98FEB), licensed,
helpstring("MyAxUI Control"), control ]
coclass NVC_MFC_AxUI
自定义允许 Activex 控件
由于 VerifyUserLicense、 GetLicenseKey和 VerifyLicenseKey 声明为控件工厂类中的虚成员函数,可以自定义控件的授权行为。
例如,您可以为控件提供允许的多个级别通过重写 VerifyUserLicense 或 VerifyLicenseKey 成员函数。 此函数内可以调整哪些属性或方法向用户公开基于您检测的许可级别。
还可以将代码添加到用于通知用户提供自定义的方法的 VerifyLicenseKey 函数控件创建失败。 例如,在您的 VerifyLicenseKey 成员函数可以显示消息框,表明该控件未能初始化,并原因。
备注
另一种自定义 Activex 控件许可证验证检查注册数据库特定注册表项,而不是调用 AfxVerifyLicFile。有关默认实现的示例,请参见本文的 实现修改文件 部分。
有关的其他讨论许可证释放,请参见。 升级现有的 Activex 控件许可证释放。