使用ATL建立支持IClassFactory2的COM组件
发布: 2007-7-01 20:40 | 作者: admin | 来源: | 查看: 19次 | 进入软件测试论坛讨论
使用ATL建立支持IClassFactory2的COM组件
关键字:COM、IClassFactory2、对象创建权限、License、License Key
本文详细描述了如何使用ATL自身的功能创建具有创建权限功能的COM对象。最后还讲述了如何创建具有固定和临时权限的COM对象,以及如何获取注册码。
1 概述
IClassFactory2接口的作用是为给COM对象增加限制控制的功能。通过这个接口,只能在有合法使用权的电脑上才可以创建COM对象的实例。
COM对象的权限有两种,一种是固定权限,在创建COM对象之前就存在电脑中,创建COM对象时不需要提供附加的信息。另一种是临时的权限,在创建对象的时候必须提供表明具有权限的注册码,临时权限不能保留在电脑中,所以,每次创建实例的时候都需要提供注册码。每个COM对象可以选择使用固定权限方式、临时权限方式或两者都使用。
COM对象可以提供取得注册码的功能。通过这个功能,可以在具有固定权限的电脑上获取的注册码。
在COM对象被创建的时候,应该检查注册码或者固定权限的信息,如果COM对象判定用户没有使用权限,可以返回CLASS_E_NOTLICENSED。
2 ATL对IClassFactory2的支持
ATL完全支持IClassFactory2。通过宏DECLARE_CLASSFACTORY2声明COM对象支持IClassFactory2接口。DECLARE_CLASSFACTORY2宏需要一个License类实现具体的许可权限验证算法和注册码验证算法。License类可以使用任何名字,其中必须定义如下的几个成员函数。License类的形式如下:
class CLicenseCls
{
protected:
static BOOL VerifyLicenseKey(BSTR bstr);
static BOOL GetLicenseKey(DWORD dwReserved, BSTR* pBstr);
static BOOL IsLicenseValid();
};
VerifyLicenseKey函数用于验证注册码的合法性。GetLicenseKey用于获取注册码。IsLicenseValid函数用于验证是否存在固定的使用权限。
用户可以根据需要,提供这三个函数的实现。如下表:
所需功能 |
VerifyLicenseKey |
GetLicenseKey |
IsLicenseValid |
不检查权限 |
FALSE |
FALSE |
TRUE |
固定权限 |
FALSE |
FALSE |
检查固定权限 |
临时权限 |
检测注册码 |
FALSE |
FALSE |
固定权限和 临时权限 |
检测注册码 |
FALSE |
检查固定权限 |
固定权限和 临时权限和 获取注册码 |
检测注册码 |
返回注册码 |
检查固定权限 |