Licensing 和 IClassFactory2

类对象的 IClassFactory 接口提供 COM 的基本对象创建机制。 使用 IClassFactory,服务器可以基于计算机控制对象创建。 IClassFactory::CreateInstance 方法的实现可以根据计算机许可证的存在来允许或禁止对象创建。 计算机许可证是独立于计算机上存在的应用程序的信息片段,用于指示软件从有效源(例如供应商的安装磁盘)安装。 如果计算机许可证不存在,服务器可以禁止对象创建。 如果用户尝试将软件从一台计算机复制到另一台计算机,计算机许可会因许可证信息未随软件一起复制,并且接收副本的计算机未获得许可而阻止盗版。

但是,在组件软件行业,供应商需要更精细地控制许可。 除了计算机许可证控制之外,供应商还需要允许某些客户端创建组件对象,同时拒绝其他客户端的相同功能。 这要求客户端应用程序在开发期间便从组件获取许可证密钥。 客户端应用程序在运行时使用许可证密钥在未获许可的计算机上创建对象。

例如,如果供应商向开发人员提供控件库,则购买该库的开发人员将拥有完整的计算机许可证,从而允许在开发计算机上创建对象。 然后,开发人员可以在包含一个或多个控件的许可计算机上生成客户端应用程序。 当生成的客户端应用程序在另一台计算机上运行时,即使该计算机没有原始供应商提供的控件的计算机许可证,也必须在另一台计算机上创建客户端应用程序中使用的控件。

IClassFactory2 接口提供此级别的控制。 若要允许为任何给定组件授予基于密钥的许可,可以在该组件的类工厂对象上实现 IClassFactory2IClassFactory2 派生自 IClassFactory,因此,通过实现 IClassFactory2,类工厂对象可满足基本 COM 要求。

若要将许可组件合并到客户端应用程序中,请在 IClassFactory2 中使用以下方法:

  • GetLicInfo 方法使用描述类工厂的许可行为的信息填充 LICINFO 结构。 例如,如果 fRunTimeKeyAvail 成员为 TRUE,则类工厂可以提供运行时许可的许可证密钥。
  • RequestLicKey 方法为组件提供许可证密钥。 客户端调用此方法时,计算机许可证必须可用。
  • 如果许可证密钥参数 (BSTRÂ bstrKey) 有效,CreateInstanceLic 方法将创建许可组件的实例。

注意

在其类型信息中,组件使用许可的属性来标记支持通过 IClassFactory2 进行许可的组件类。

 

首先,需要单独的开发工具,该工具也是许可组件的客户端。 此工具可获取运行时许可证密钥并将其保存在客户端应用程序中。 此工具仅在拥有组件的计算机许可证的计算机上运行。 该工具调用 GetLicInfoRequestLicKey 方法以获取运行时许可证密钥,然后将许可证密钥保存在客户端应用程序中。 例如,开发工具可以创建包含 BSTR 许可证密钥的标头 (.h) 文件,然后将该 .h 文件包含在客户端应用程序中。

若要实例化客户端应用程序中的组件,请先尝试使用 IClassFactory::CreateInstance 直接实例化对象。 如果 CreateInstance 成功,则可以为组件授予第二台计算机的许可,并随时可以创建对象。 如果 CreateInstance 失败并提供返回代码 CLASS_E_NOTLICENSED,则创建对象的唯一方法是将运行时密钥传递给 CreateInstanceLic 方法。 CreateInstanceLic 验证密钥,如果密钥有效,则创建对象。

这样,使用组件(如控件)构建的应用程序可以在没有其他许可证的计算机上运行,仅允许包含运行时许可证的客户端应用程序创建相关组件对象。

IClassFactory2 接口支持许可方案灵活应用。 例如,服务器实现程序可以加密组件中的许可证密钥,以提高安全性。 服务器实现程序还可以通过为不同的功能提供不同的许可证密钥来启用或禁用其对象中的功能级别。 例如,一个密钥可能允许基本级别的功能,而另一个密钥则允许基本和高级功能等。

COM 服务器职责