CComClassFactory2 类

此类实现 IClassFactory2 接口。

语法

template <class license>
class CComClassFactory2 : public IClassFactory2,
    public CComObjectRootEx<CComGlobalsThreadModel>,
    public license

参数

license
实现以下静态函数的类:

  • static BOOL VerifyLicenseKey( BSTR bstr );

  • static BOOL GetLicenseKey( DWORD dwReserved, BSTR * pBstr );

  • static BOOL IsLicenseValid( );

成员

公共方法

名称 描述
CComClassFactory2::CreateInstance 创建指定 CLSID 的对象。
CComClassFactory2::CreateInstanceLic 给定许可证密钥后,创建指定 CLSID 的对象。
CComClassFactory2::GetLicInfo 检索描述类工厂许可功能的信息。
CComClassFactory2::LockServer 锁定内存中的类工厂。
CComClassFactory2::RequestLicKey 创建并返回许可证密钥。

注解

CComClassFactory2 实现 IClassFactory2 接口,该接口是 IClassFactory 的扩展。 IClassFactory2 通过许可证控制对象创建。 在许可计算机上执行的类工厂可以提供运行时许可证密钥。 此许可证密钥允许应用程序在不存在完整计算机许可证时实例化对象。

ATL 对象通常通过从 CComCoClass 派生来获取类工厂。 此类包括宏 DECLARE_CLASSFACTORY,该宏将 CComClassFactory 声明为默认类工厂。 若要使用 CComClassFactory2,请在对象的类定义中指定 DECLARE_CLASSFACTORY2 宏。 例如:

class ATL_NO_VTABLE CMyClass2 :
   public CComObjectRootEx<CComSingleThreadModel>,
   public CComCoClass<CMyClass2, &CLSID_MyClass>,
   public IDispatchImpl<IMyClass, &IID_IMyClass, &LIBID_NVC_ATL_COMLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
   public IDispatchImpl<IMyDualInterface, &__uuidof(IMyDualInterface), &LIBID_NVC_ATL_COMLib, /* wMajor = */ 1, /* wMinor = */ 0>
{
public:
   DECLARE_CLASSFACTORY2(CMyLicense)

   // Remainder of class declaration omitted

CMyLicenseCComClassFactory2 的模板参数,必须实现静态函数 VerifyLicenseKeyGetLicenseKeyIsLicenseValid。 下面是一个简单类型定义的示例:

class CMyLicense
{
protected:
   static BOOL VerifyLicenseKey(BSTR bstr)
   {
      USES_CONVERSION;
      return !lstrcmp(OLE2T(bstr), _T("My run-time license key"));
   }

   static BOOL GetLicenseKey(DWORD /*dwReserved*/, BSTR* pBstr) 
   {
      USES_CONVERSION;
      *pBstr = SysAllocString( T2OLE(_T("My run-time license key"))); 
      return TRUE;
   }

   static BOOL IsLicenseValid() {  return TRUE; }
};

CComClassFactory2 派生自 CComClassFactory2Base许可证。 反过来,CComClassFactory2Base 派生自 IClassFactory2CComObjectRootEx< CComGlobalsThreadModel >

继承层次结构

CComObjectRootBase

license

CComObjectRootEx

IClassFactory2

CComClassFactory2

要求

标头:atlcom.h

CComClassFactory2::CreateInstance

创建指定 CLSID 的对象并检索指向此对象的接口指针。

STDMETHOD(CreateInstance)(LPUNKNOWN pUnkOuter, REFIID riid, void** ppvObj);

参数

pUnkOuter
[in] 如果要创建聚合中的对象,pUnkOuter 必须是外部未知参数。 否则,pUnkOuter 必须为 NULL。

riid
[in] 请求的 接口的 IID。 如果 pUnkOuter 为非 NULL,riid 必须是 IID_IUnknown

ppvObj
[out] 指向 riid 标识的接口指针的指针。 如果对象不支持此接口,则 ppvObj 设置为 NULL。

返回值

标准 HRESULT 值。

备注

要求计算机获得完全许可。 如果完整计算机许可证不存在,请调用 CreateInstanceLic

CComClassFactory2::CreateInstanceLic

CreateInstance 类似,只不过 CreateInstanceLic 需要许可证密钥。

STDMETHOD(CreateInstanceLic)(
    IUnknown* pUnkOuter,
    IUnknown* /* pUnkReserved
*/,
    REFIID riid,
    BSTR bstrKey,
    void** ppvObject);

参数

pUnkOuter
[in] 如果要创建聚合中的对象,pUnkOuter 必须是外部未知参数。 否则,pUnkOuter 必须为 NULL。

pUnkReserved
[in] 未使用。 必须为 NULL。

riid
[in] 请求的 接口的 IID。 如果 pUnkOuter 为非 NULL,riid 必须是 IID_IUnknown

bstrKey
[in] 以前从调用 RequestLicKey 获取的运行时许可证密钥。 创建对象需要此密钥。

ppvObject
[out] 指向 riid 指定的接口指针的指针。 如果对象不支持此接口,则 ppvObject 设置为 NULL。

返回值

标准 HRESULT 值。

注解

可以使用 RequestLicKey 获取许可证密钥。 若要在未经许可的计算机上创建对象,必须调用 CreateInstanceLic

CComClassFactory2::GetLicInfo

使用描述类工厂许可功能的信息填充 LICINFO 结构。

STDMETHOD(GetLicInfo)(LICINFO* pLicInfo);

参数

pLicInfo
[out] 指向 LICINFO 结构的指针。

返回值

标准 HRESULT 值。

备注

此结构的 fRuntimeKeyAvail 成员指示在给定许可证密钥的情况下,类工厂是否允许在未经许可的计算机上创建对象。 fLicVerified 成员指示是否存在完整的计算机许可证。

CComClassFactory2::LockServer

通过分别调用 _Module::Lock_Module::Unlock,递增和递减模块锁计数。

STDMETHOD(LockServer)(BOOL fLock);

参数

fLock
[in] 如果为 TRUE,则锁计数递增;否则,锁计数递减。

返回值

标准 HRESULT 值。

备注

_Module 引用 CComModule 的全局实例或派生自它的类。

调用 LockServer 允许客户端保留到类工厂,以便快速创建多个对象。

CComClassFactory2::RequestLicKey

创建并返回许可证密钥,前提是 LICINFO 结构的 fRuntimeKeyAvail 成员为 TRUE。

STDMETHOD(RequestLicKey)(DWORD dwReserved, BSTR* pbstrKey);

参数

dwReserved
[in] 未使用。 必须为零。

pbstrKey
[out] 指向许可证密钥的指针。

返回值

标准 HRESULT 值。

注解

调用 CreateInstanceLic 以在未经许可的计算机上创建对象需要许可证密钥。 如果 fRuntimeKeyAvail 为 FALSE,则只能在完全许可的计算机上创建对象。

调用 GetLicInfo 以检索值 fRuntimeKeyAvail

另请参阅

CComClassFactoryAutoThread 类
CComClassFactorySingleton 类
CComObjectRootEx 类
CComGlobalsThreadModel
类概述