使用ATL建立支持IClassFactory2的COM组件

原创 2003年06月03日 07:48:00
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

使用ATL建立支持IClassFactory2的COM组件

 

关键字:COMIClassFactory2、对象创建权限、LicenseLicense 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

检查固定权限

固定权限和

临时权限和

获取注册码

检测注册码

返回注册码

检查固定权限

3      实现方式

3.1     License类

实现License类的成员函数:

 

class CMyLicense

{

protected:

static BOOL VerifyLicenseKey(BSTR bstrLicenseKey)

{

  if (wcscmp(bstrLicenseKey, OLESTR("Template License Key")) == 0)

  {

    return TRUE;

  }

  return FALSE;

}

 

static BOOL GetLicenseKey(DWORD dwReserved, BSTR* pBstrLicenseKey)

{

  if (pBstrLicenseKey)

  {

    * pBstrLicenseKey = SysAllocString(OLESTR("Template License Key "));

  }

  return TRUE;

}

 

static BOOL IsLicenseValid() {  return TRUE; }

};

 

以上例子中,IsLicenseValid函数永远返回真。在实际使用中,要验证电脑中是否存在固定权限。如果存在固定权限则返回真,否则返回假。这个例子中使用的是固定注册码,也可以根据需要使用伪随机注册码。

3.2     实现IClassFactory2接口

ATLCOM对象类中通过DECLARE_CLASSFACTORY2宏声明在类对象中使用IClassFactory2接口。DECLARE_CLASSFACTORY2宏的定义如下:

 

DECLARE_CLASSFACTORY2(lic)

 

其中licLicense类的名称,本例中为CMyLicense

4      创建需要License的COM对象

4.1     具有固定权限的COM对象

创建具有固定权限的COM对象的方法和创建普通COM对象是相同的。不需要提供任何附加的信息。

使用CoCreateInstance可以方便的创见固定权限的COM对象。CoCreateInstance的定义如下:

 

STDAPI CoCreateInstance(

REFCLSID rclsid,

LPUNKNOWN pUnkOuter,

DWORD dwClsContext,

REFIID riid,

LPVOID * ppv

);

 

rclsid是要创建对象的CLSID

pUnkOuter用于聚合的情况,不使用聚合的时候,使用NULL

dwClsContext指定COM对象的运行环境,一般情况使用CLSCTX_ALL表示可以在任何环境运行。

riid是需要返回的接口的IID

ppv是返回的接口指针的地址。

具体代码如下:

 

Iyyy * pObj;

HRESULT hr;

hr = CoCreateInstance(CLSID_xxx, NULL, CLSCTX_ALL, IID_yyy, &pObj);

if (FAILED(hr))

{

    ...

}

 

4.2     使用临时权限

使用临时权限创建COM对象,需要一个注册码。注册码可以从COM对象本身获取,也可以通过其它方式取得(如购买等)。使用临时权限创建COM对象需要两个步骤:取得COM类对象和创建COM对象。

4.2.1        取得COM类对象

通过CoGetClassObject函数,可以获取类对象。CoGetClassObject的定义如下:

 

STDAPI CoGetClassObject(

REFCLSID rclsid,

DWORD dwClsContext,

COSERVERINFO * pServerInfo,

REFIID riid,

LPVOID * ppv

);

 

rclsid是要创建COM对象的CLSID

dwClsContextCOM对象的运行方式,一般情况使用CLSCTX_ALL表示可以在任何环境运行。

pServerInfo用于在另一台电脑上创建COM对象,在本地创建时用NULL

riid是所需要的接口的IID,这里使用IID_IClassFactory2

ppv是返回接口指针的地址。

可以看出,前两个参数和在CoCreateInstance中的定义是相同的。

具体代码:

 

    IClassFactory2 * pCF2;

    HRESULT hr;

  hr = CoGetClassObject(CLSID_xxx, CLSCTX_ALL, NULL,

IID_IClassFactory2, (void **)&pCF2);

    if (FAILED(hr))

{

    ...

}

    ...

       

4.2.2        创建对象

通过IClassFactory2CreateInstanceLic方法,可以使用临时权限创建对象。在取得了COM类对象之后,调用CreateInstanceLic方法,并且把注册码作为参数,就可以得到新建的COM对象的接口指针。

CreateInstanceLic的定义如下:

 

HRESULT CreateInstanceLic(

IUnknown* pUnkOuter,

IUnknown* pUnkReserved,

REFIID riid,

BSTR bstrKey,

void** ppvObject

);

 

pUnkOuter是聚合的外部对象指针,在不使用聚合的时候,用NULL

pUnkReserved是保留的参数,用NULL

riid是所需要返回的接口IID

bstrKey是注册码。

ppvObject是保存返回的接口指针的地址。

具体代码:

 

Ixxx * pObj;

hr = pCF2->CreateInstanceLic(NULL, NULL, IID_Ixxx,

bstrLicenseKey, (void**) &pObj);

if (FAILED(hr))

{

    ...

}

 

创建之后就可以像使用普通COM对象一样使用新建的COM对象。

4.3     获取注册码

首先要取得类对象的指针,详见第4.2.1节。

在取得了IClassFactory2的指针之后,通过RequestLicKey方法可以取得注册码。

RequestLicKey的定义如下:

 

HRESULT RequestLicKey(

  DWORD dwReserved,

  BSTR* pbstrKey

);

 

dwReserved是保留参数,用0

pbstrKey是保存返回的注册码的地址。调用方负责释放返回值的地址。

具体代码:

 

BSTR bstrLicKey;

hr = pCF2->RequestLicKey(0, &bstrLicKey);

if (FAILED(hr))

{

    ...

}

...

SysFreeString(bstrLicKey);

 

VS2010创建ATL工程及使用C++测试COM组件

VS2010创建ATL工程及使用C++测试COM组件 2014年09月05日 ⁄ 综合 ⁄ 共 563字 ⁄ 字号 小 中 大 ⁄ 评论关闭 1.创建ATL...
  • Sayesan
  • Sayesan
  • 2015年10月22日 09:37
  • 2455

VS2012创建ATL工程及使用MFC测试COM组件

这篇文章首先介绍了如何创建一个ATL工程,并为其添加接口类和实现接口方法;然后介绍了如何利用自动化的方式调用由ATL生成的dll,即在程序中获取CLSID和IID然后创建接口实例;最后分析了在程序中C...
  • pigautumn
  • pigautumn
  • 2015年01月22日 16:23
  • 6563

VS2010 简单ATL COM开发(上)

1、打开VS2010,新建ATL COM 项目,步骤:“文件” --》“新建” --》“项目”,选择“Visual C++” --》“ATL 项目” ,填写“名称” FirstCOM --》“确定”。...
  • wangwenjing90
  • wangwenjing90
  • 2013年04月08日 14:03
  • 17597

使用ATL建立支持IClassFactory2的COM组件

使用ATL建立支持IClassFactory2的COM组件 发布: 2007-7-01 20:40 | 作者: admin | 来源: | 查看: 19次 | 进入软件测试论坛讨论 领测软件测...
  • worldy
  • worldy
  • 2013年11月15日 17:11
  • 651

使用VC++/ATL创建一个Office2K AddIn Com 组件

原文:http://www.xaradio.com/errorpages/GeneralError.htm?aspxerrorpath=/ShowFAQ.aspx 概况: 通过这篇文章,我们将...
  • shining_cd
  • shining_cd
  • 2012年02月28日 14:25
  • 739

创建ATL工程及使用C++测试COM组件

VS2010创建ATL工程及使用C++测试COM组件              1.创建ATL项目,取名MyCom 2. ATL 项目向导,勾选 【支持COM+ 1.0】和【支...
  • jiangqin115
  • jiangqin115
  • 2015年09月08日 09:31
  • 761

使用ATL进行com组件的开发

一、前言   1、如果你在使用 vc5.0 及以前的版本,请你升级为 vc6.0 或 vc.net 2003;   2、如果你在使用 vc6.0 (ATL 3.0)请阅读本回内容; ...
  • lp310018931
  • lp310018931
  • 2014年06月18日 21:35
  • 1325

vba调用vs2005使用atl开发的com组件

1、新建工程 New -- Project -- ATL Project 勾选Allow merging of proxy/stub code 2、添加接口 右键工程 --  Add  --  A...
  • hyhnoproblem
  • hyhnoproblem
  • 2014年12月24日 20:17
  • 2050

VS2012创建ATL工程及使用MFC测试COM组件

VS2012创建ATL工程及使用MFC测试COM组件
  • jacke121
  • jacke121
  • 2017年12月03日 12:58
  • 52

VS2010创建ATL工程及使用C++测试COM组件

1.创建ATL项目,取名MyCom 2. ATL 项目向导,勾选 【支持COM+ 1.0】和【支持部件注册器】,其他默认,点击完成。 3.在该项目中添加类 4.添加一个ATL简单对象...
  • xiaojun111111
  • xiaojun111111
  • 2015年03月30日 12:17
  • 788
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用ATL建立支持IClassFactory2的COM组件
举报原因:
原因补充:

(最多只允许输入30个字)