ActiveX コントロールのオプション機能であるライセンス サポートを使用すると、コントロールを使用または配布できるユーザーを制御できます。 (ライセンスの問題の詳細については、「 既存の ActiveX コントロールのアップグレードにおけるライセンスの問題」を参照してください)。
Von Bedeutung
ActiveX は、新しい開発には使用すべきではないレガシ テクノロジです。 ActiveX に代わる最新のテクノロジの詳細については、「 ActiveX コントロール」を参照してください。
この記事では、次のトピックについて説明します。
ライセンスを実装する ActiveX コントロールを使用すると、コントロール開発者は、他のユーザーが ActiveX コントロールを使用する方法を決定できます。 コントロール購入者には、コントロールと.LICファイルを提供します。ただし、購入者はコントロールを使用するアプリケーションとともに、コントロールを配布することができますが、.LICファイルを配布することはできません。 これにより、そのアプリケーションのユーザーは、最初にコントロールにライセンスを付与することなく、コントロールを使用する新しいアプリケーションを作成できなくなります。
ActiveX コントロール ライセンスの概要
ActiveX コントロールのライセンス サポートを提供するために、 COleObjectFactory クラスは、 IClassFactory2 インターフェイス内のいくつかの関数 ( IClassFactory2::RequestLicKey、 IClassFactory2::GetLicInfo、 IClassFactory2::CreateInstanceLic) の実装を提供します。 コンテナー アプリケーション開発者がコントロールのインスタンスを作成する要求を行うと、GetLicInfo が呼び出され、コントロールの .LIC ファイルが存在することを確認します。 コントロールがライセンスされている場合は、コントロールのインスタンスを作成してコンテナーに配置できます。 開発者がコンテナー アプリケーションの構築を完了すると、今度は RequestLicKeyする別の関数呼び出しが行われます。 この関数は、コンテナー アプリケーションにライセンス キー (単純な文字列) を返します。 返されたキーは、アプリケーションに埋め込まれます。
次の図は、コンテナー アプリケーションの開発中に使用される ActiveX コントロールのライセンス検証を示しています。 前に説明したように、コンテナー アプリケーション開発者は、コントロールのインスタンスを作成するために、開発マシンに適切な .LIC ファイルがインストールされている必要があります。
開発中のライセンス付き ActiveX コントロールの検証
次のプロセスは、次の図に示すように、エンド ユーザーがコンテナー アプリケーションを実行するときに発生します。
アプリケーションを起動するときは、通常、コントロールのインスタンスを作成する必要があります。 コンテナーは、 CreateInstanceLicを呼び出し、埋め込みライセンス キーをパラメーターとして渡すことによってこれを実現します。 その後、埋め込みライセンス キーとコントロール独自のライセンス キーのコピーの間で文字列比較が行われます。 一致が成功した場合、コントロールのインスタンスが作成され、アプリケーションは引き続き正常に実行されます。 に注意してください。制御ユーザーのマシンに LIC ファイルが存在する必要はありません。
実行中のライセンスされた ActiveX コントロールの検証
コントロール ライセンスは、コントロール実装 DLL 内の特定のコードとライセンス ファイルという 2 つの基本的なコンポーネントで構成されます。 このコードは、2 つの (または場合によっては 3 つの) 関数呼び出しと、次に著作権表示を含む "ライセンス文字列" と呼ばれる文字列で構成されます。 これらの呼び出しとライセンス文字列は、コントロールの実装 (.CPP) ファイルに含まれています。 ActiveX コントロール ウィザードによって生成されるライセンス ファイルは、著作権に関する声明を含むテキスト ファイルです。 プロジェクト名と .LIC 拡張子を使って命名されます(例: SAMPLE.LIC)。 デザイン時の使用が必要な場合は、ライセンスされたコントロールにライセンス ファイルを添付する必要があります。
ライセンスコントロールの作成
ActiveX コントロール ウィザードを使用してコントロール フレームワークを作成すると、ライセンスサポートを簡単に含めることができます。 コントロールにランタイム ライセンスが必要であることを指定すると、ActiveX コントロール ウィザードによって、ライセンスをサポートするコードがコントロール クラスに追加されます。 このコードは、ライセンス検証にキーとライセンス ファイルを使用する関数で構成されています。 これらの関数は、コントロール ライセンスをカスタマイズするように変更することもできます。 ライセンスのカスタマイズの詳細については、この記事で後述 する ActiveX コントロールのライセンスのカスタマイズを 参照してください。
コントロール プロジェクトの作成時に ActiveX コントロール ウィザードでライセンスのサポートを追加するには
- MFC ActiveX コントロールの作成に関するページの手順を使用します。 ActiveX コントロール ウィザードの [アプリケーション設定] ページには、ランタイム ライセンスを使用してコントロールを作成するオプションが含まれています。
ActiveX コントロール ウィザードで、基本的なライセンス サポートを含む ActiveX コントロール フレームワークが生成されるようになりました。 ライセンス コードの詳細については、次のトピックを参照してください。
ライセンス サポート
ActiveX コントロール ウィザードを使用して ActiveX コントロールにライセンス サポートを追加すると、ActiveX コントロール ウィザードは、ライセンス機能を宣言して実装するコードをコントロール ヘッダーと実装ファイルに追加します。 このコードは、VerifyUserLicense で見つかった既定の実装をオーバーライドする、GetLicenseKey メンバー関数と メンバー関数で構成されます。 これらの関数は、制御ライセンスを取得して検証します。
注
3 番目のメンバー関数 ( VerifyLicenseKey は ActiveX コントロール ウィザードによって生成されませんが、ライセンス キーの検証動作をカスタマイズするためにオーバーライドできます。
これらのメンバー関数は次のとおりです。
-
コントロール ライセンス ファイルが存在することをシステムで確認して、コントロールでデザイン時の使用が許可されていることを確認します。 この関数は、
IClassFactory2::GetLicInfoとIClassFactory::CreateInstanceLicの処理の一環としてフレームワークによって呼び出されます。 -
コントロール DLL に一意のキーを要求します。 このキーはコンテナー アプリケーションに埋め込まれており、後で
VerifyLicenseKeyと組み合わせて使用して、コントロールのインスタンスを作成します。 この関数は、IClassFactory2::RequestLicKeyの処理の一環としてフレームワークによって呼び出されます。 -
埋め込みキーとコントロールの一意キーが同じであることを確認します。 これにより、コンテナーはコントロールのインスタンスを作成して使用できます。 この関数は、
IClassFactory2::CreateInstanceLicの処理の一環としてフレームワークによって呼び出され、ライセンス キーのカスタマイズされた検証を提供するためにオーバーライドできます。 既定の実装では、文字列比較が実行されます。 詳細については、この記事で後述 する「ActiveX コントロールのライセンスのカスタマイズ」を参照してください。
ヘッダー ファイルの変更
ActiveX コントロール ウィザードは、コントロール ヘッダー ファイルに次のコードを配置します。 この例では、 CSampleCtrlのオブジェクト factory の 2 つのメンバー関数が宣言されています。1 つはコントロールの存在を検証します。LIC ファイルと、コントロールを含むアプリケーションで使用するライセンス キーを取得する別のファイル:
BEGIN_OLEFACTORY(CMyAxUICtrl) // Class factory and guid
virtual BOOL VerifyUserLicense();
virtual BOOL GetLicenseKey(DWORD, BSTR FAR*);
END_OLEFACTORY(CMyAxUICtrl)
実装ファイルの変更
ActiveX コントロール ウィザードは、次の 2 つのステートメントをコントロール実装ファイルに配置して、ライセンス ファイル名とライセンス文字列を宣言します。
static const TCHAR BASED_CODE _szLicFileName[] = _T("NVC_MFC_AxUI.lic");
static const WCHAR BASED_CODE _szLicString[] = L"Copyright (c) 2006 ";
注
何らかの方法で szLicString を変更する場合は、コントロールの最初の行も変更する必要があります。LIC ファイルまたはライセンスが正しく機能しません。
ActiveX コントロール ウィザードは、コントロール実装ファイルに次のコードを配置して、コントロール クラスの VerifyUserLicense 関数と GetLicenseKey 関数を定義します。
// CMyAxUICtrl::CMyAxUICtrlFactory::VerifyUserLicense -
// Checks for existence of a user license
BOOL CMyAxUICtrl::CMyAxUICtrlFactory::VerifyUserLicense()
{
return AfxVerifyLicFile(AfxGetInstanceHandle(), _szLicFileName, _szLicString);
}
// CMyAxUICtrl::CMyAxUICtrlFactory::GetLicenseKey -
// Returns a runtime licensing key
BOOL CMyAxUICtrl::CMyAxUICtrlFactory::GetLicenseKey(DWORD /*dwReserved*/,
BSTR FAR* pbstrKey)
{
if (pbstrKey == NULL)
return FALSE;
*pbstrKey = SysAllocString(_szLicString);
return (*pbstrKey != NULL);
}
最後に、ActiveX コントロール ウィザードによってコントロール プロジェクトのIDLファイルが変更されます。 次の例のように、 ライセンスキーワード がコントロールのコクラス宣言に追加されます。
[uuid(913E450B-E720-4C71-BCDF-71C96EE98FEB), licensed,
helpstring("MyAxUI Control"), control]
coclass NVC_MFC_AxUI
ActiveX コントロールのライセンスのカスタマイズ
VerifyUserLicense、GetLicenseKey、およびVerifyLicenseKeyはコントロール ファクトリ クラスの仮想メンバー関数として宣言されているため、コントロールのライセンス動作をカスタマイズできます。
たとえば、 VerifyUserLicense または VerifyLicenseKey メンバー関数をオーバーライドすることで、コントロールにいくつかのレベルのライセンスを提供できます。 この関数内では、検出したライセンス レベルに応じて、ユーザーに公開されるプロパティまたはメソッドを調整できます。
また、コントロールの作成が失敗したことをユーザーに通知するためのカスタマイズされたメソッドを提供するコードを VerifyLicenseKey 関数に追加することもできます。 たとえば、 VerifyLicenseKey メンバー関数では、コントロールの初期化に失敗した理由を示すメッセージ ボックスを表示できます。
注
ActiveX コントロール ライセンス検証をカスタマイズするもう 1 つの方法は、 AfxVerifyLicFileを呼び出す代わりに、特定のレジストリ キーの登録データベースを確認することです。 既定の実装の例については、この記事の 「実装ファイルの変更 」セクションを参照してください。
ライセンスの問題の詳細については、「 既存の ActiveX コントロールのアップグレードにおけるライセンスの問題」を参照してください。