IClassFactory2
COM公式ドキュメント
任意の種類のオブジェクトサーバーにおけるクラスファクトリオブジェクトが、ライセンスを通じてオブジェクトの生成を制御できるようにします。
メソッド 3
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
このクラスファクトリのライセンス機能に関する情報を取得します。
| pLicInfo | LICINFO* | inout | 出力時に値が設定される、呼び出し側が確保した LICINFO 構造体へのポインター。 |
戻り値
このメソッドは標準の戻り値 E_UNEXPECTED を返すことがあるほか、次の値を返すことがあります。
| 戻り値 | 説明 |
|---|---|
| LICINFO 構造体に値が正常に設定されました。 | |
| pLicInfo のアドレスが無効です。たとえば NULL である可能性があります。 |
解説(Remarks)
実装者への注意
このメソッドはライセンス付きクラスファクトリのクライアントにとって重要な情報を提供するため、E_NOTIMPL を戻り値として使用することは許可されていません。呼び出し側が保存しておき、後でライセンス付きオブジェクトのインスタンスを生成するために使用できるライセンスキーを作成します。
| dwReserved | DWORD | in | このパラメーターは予約されており、ゼロである必要があります。 |
| pBstrKey | LPWSTR* | out | このメソッドから正常に戻った際に、呼び出される側が確保したライセンスキーを受け取る、呼び出し側が確保した変数へのポインター。何らかの失敗が発生した場合、このパラメーターは NULL に設定されます。 |
戻り値
このメソッドは標準の戻り値 E_INVALIDARG、E_OUTOFMEMORY、E_UNEXPECTED を返すことがあるほか、次の値を返すことがあります。
| 戻り値 | 説明 |
|---|---|
| ライセンスキーが正常に作成されました。 | |
| このクラスファクトリは実行時ライセンスキーをサポートしていません。 | |
| pbstrKey で渡されたアドレスが無効です。たとえば NULL である可能性があります。 | |
| このクラスファクトリは実行時ライセンスをサポートしていますが、現在のマシン自体がライセンスされていません。そのため、このマシンでは実行時キーを利用できません。 |
解説(Remarks)
呼び出し側はこのライセンスキーを保存しておき、後で IClassFactory2::CreateInstanceLic を呼び出して、本来はライセンスされていないマシン上でオブジェクトを生成することができます。
呼び出し側への注意
キーが不要になった時点で、呼び出し側は SysFreeString 関数を使用して BSTR を解放する必要があります。fRuntimeKeyAvail の値は、事前に IClassFactory2::GetLicInfo を呼び出すことで返されます。実装者への注意
このメソッドは SysAllocString または SysAllocStringLen を使用して BSTR キーを確保します。このメソッドが正常に戻った後は、その BSTR の管理責任は呼び出し側に移ります。クラスファクトリが実行時ライセンスキーをサポートしていない場合、このメソッドを実装する必要はありません。
指定されたライセンスキーに対応する、ライセンス付きオブジェクトのインスタンスを生成します。このメソッドは、本来はライセンスされていないマシン上でオブジェクトを生成するための唯一の手段です。
| pUnkOuter | IUnknown* | inoptional | このオブジェクトが集約 (アグリゲート) の一部として生成される場合における、外側の unknown 上の制御用 IUnknown インターフェースへのポインター。オブジェクトが集約の一部でない場合、このパラメーターは NULL である必要があります。 |
| pUnkReserved | IUnknown* | optional | このパラメーターは使用されず、NULL である必要があります。 |
| riid | GUID* | in | 新しく生成されたオブジェクトと通信するために使用するインターフェースの識別子への参照。 |
| bstrKey | LPWSTR | in | オブジェクトを生成するために必要となる、事前に IClassFactory2::RequestLicKey から取得した実行時ライセンスキー。 |
| ppvObj | void** | out | riid で要求されたインターフェースポインターを受け取るポインター変数のアドレス。正常に戻ると、*ppvObj には要求されたインターフェースポインターが格納されます。エラーが発生した場合、実装は *ppvObj を NULL に設定する必要があります。 |
戻り値
このメソッドは標準の戻り値 E_INVALIDARG、E_OUTOFMEMORY、E_UNEXPECTED を返すことがあるほか、次の値を返すことがあります。
| 戻り値 | 説明 |
|---|---|
| ライセンスが正常に作成されました。 | |
| オブジェクトは IClassFactory::CreateInstance を通じて完全にライセンスされたマシン上でのみ生成できるため、このメソッドは実装されていません。 | |
| bstrKey または ppvObj で渡されたポインターが無効です。たとえば NULL である可能性があります。 | |
| オブジェクトは生成可能 (かつライセンスキーは有効) ですが、そのオブジェクトが riid で指定されたインターフェースをサポートしていません。 | |
| pUnkOuter パラメーターが NULL 以外ですが、このオブジェクトクラスは集約をサポートしていません。 | |
| bstrKey で指定されたキーが有効なライセンスキーではありません。 |
解説(Remarks)
実装者への注意
クラスファクトリがライセンスキーを提供しない場合 (すなわち IClassFactory2::RequestLicKey が E_NOTIMPL を返し、かつ IClassFactory2::GetLicInfo において LICINFO の fRuntimeKeyAvail メンバーが FALSE に設定されている場合)、このメソッドも E_NOTIMPL を返すことがあります。このような場合、クラスファクトリは単に LICINFO の fLicVerified メンバーを通じてマシンがそもそもライセンスされているかどうかを示すためだけに IClassFactory2 を実装していることになります。Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IClassFactory2 "{B196B28F-BAB4-101A-B69C-00AA00341D07}" #usecom global IClassFactory2 IID_IClassFactory2 "{}" #comfunc global IClassFactory2_GetLicInfo 5 var #comfunc global IClassFactory2_RequestLicKey 6 int,var #comfunc global IClassFactory2_CreateInstanceLic 7 sptr,sptr,var,wstr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IClassFactory2 "{B196B28F-BAB4-101A-B69C-00AA00341D07}" #usecom global IClassFactory2 IID_IClassFactory2 "{}" #comfunc global IClassFactory2_GetLicInfo 5 sptr #comfunc global IClassFactory2_RequestLicKey 6 int,sptr #comfunc global IClassFactory2_CreateInstanceLic 7 sptr,sptr,sptr,wstr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。