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
CMyLicense
,CComClassFactory2
的模板参数,必须实现静态函数 VerifyLicenseKey
、GetLicenseKey
和 IsLicenseValid
。 下面是一个简单类型定义的示例:
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
派生自 IClassFactory2
和 CComObjectRootEx< CComGlobalsThreadModel >
。
继承层次结构
CComObjectRootBase
license
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
类概述