CComClassFactory2 類別
這個類別會實作 IClassFactory2 介面。
語法
template <class license>
class CComClassFactory2 : public IClassFactory2,
public CComObjectRootEx<CComGlobalsThreadModel>,
public 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
控制透過授權建立物件。 在授權電腦上執行的 Class Factory 可以提供運行時間授權密鑰。 此授權金鑰可讓應用程式在完整計算機授權不存在時具現化物件。
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);
參數
羊群
[in]如果為 TRUE,則會遞增鎖定計數;否則,鎖定計數會遞減。
傳回值
標準 HRESULT 值。
備註
_Module
是指 CComModule 的全域實例或衍生自它的類別。
呼叫 LockServer
可讓用戶端保留至類別處理站,以便快速建立多個物件。
CComClassFactory2::RequestLicKey
建立並傳回授權密鑰,前提是 fRuntimeKeyAvail
LICINFO 結構的成員為 TRUE。
STDMETHOD(RequestLicKey)(DWORD dwReserved, BSTR* pbstrKey);
參數
dwReserved
[in] 未使用。 必須是零。
pbstrKey
[out]授權金鑰的指標。
傳回值
標準 HRESULT 值。
備註
呼叫 CreateInstanceLic 以在未授權的電腦上建立物件時,需要授權密鑰。 如果 fRuntimeKeyAvail
為 FALSE,則只能在完全授權的電腦上建立物件。
呼叫 GetLicInfo 以擷取 的值 fRuntimeKeyAvail
。
另請參閱
CComClassFactoryAutoThread 類別
CComClassFactorySingleton 類別
CComObjectRootEx 類別
CComGlobalsThreadModel
類別概觀