MFC ActiveX コントロール : ActiveX コントロールのライセンス
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 コントロールのライセンス検査
コントロールのライセンスには、2 つの基本的なコンポーネントで構成されます。コントロールの実装 DLL に固有のコードとライセンス ファイル。 この DLL 内のコードは、2 つ (または 3 つ) の関数呼び出しと著作権表記の文字列で構成されています。この文字列をこれより "ライセンス文字列" と呼びます。 これらの関数呼び出しとライセンス文字列は、コントロールの実装 (.CPP) ファイルにあります。 ActiveX コントロール ウィザードによって生成されるライセンス ファイルは、著作権表記を含むテキスト ファイルです。 このファイルの名前は、プロジェクト名に拡張子 .LIC が付いたものになります (SAMPLE.LIC など)。 ライセンス コントロールをデザイン時に使用する場合には、ライセンス ファイルが必要です。
ライセンス コントロールの作成
ActiveX コントロール ウィザードを使ってコントロール フレームワークを作成するときに、ライセンス サポートを簡単に追加できます。 コントロールにランタイム ライセンスが必要であることを指定すると、ライセンスをサポートするためのコードがコントロール クラスに自動的に追加されます。 追加されるコードは、キーとライセンス ファイルを使ってライセンスを検査する関数で構成されています。 これらの関数を変更して、コントロールのライセンスをカスタマイズすることもできます。 ライセンスのカスタマイズの詳細については、この後の「ActiveX コントロールのライセンスのカスタマイズ」を参照してください。
コントロール プロジェクトの作成時に ActiveX コントロール ウィザードでライセンス サポートを追加するには
- 「MFC ActiveX コントロールの作成」の手順に従います。 ActiveX コントロール ウィザードの [アプリケーションの設定] ページに、ランタイム ライセンスを持つコントロールを作成するためのオプションがあります。
ActiveX コントロール ウィザードによって、基本的なライセンス サポートを備えた ActiveX コントロール フレームワークが生成されます。 ライセンス コードの詳細については、次のトピックを参照してください。
ライセンス サポート
ActiveX コントロール ウィザードを使って ActiveX コントロールにライセンス サポートを追加すると、ライセンス機能の宣言および実装のためのコードがコントロールのヘッダー ファイルと実装ファイルに追加されます。 このコードは、VerifyUserLicense メンバー関数と GetLicenseKey メンバー関数で構成されています。これらのメンバー関数は、COleObjectFactory の既定の実装をオーバーライドします。 これらの関数によって、コントロールのライセンスの取得および検査が行われます。
注意
ここで紹介するもう 1 つのメンバー関数 VerifyLicenseKey は、ActiveX コントロール ウィザードによって生成されませんが、このメンバー関数をオーバーライドすると、ライセンス キーの検査方法をカスタマイズできます。
各メンバー関数の機能は次のとおりです。
-
システム内にコントロールのライセンス ファイルがあるかどうかを確認することによって、デザイン時のコントロールの使用が許可されているかどうかを検査します。 この関数は、IClassFactory2::GetLicInfo と IClassFactory::CreateInstanceLic の処理の過程でフレームワークによって呼び出されます。
-
コントロールの DLL から一意のキーを要求します。 受け取ったキーは、コンテナー アプリケーションに埋め込まれ、後にコントロールのインスタンスを作成するときに VerifyLicenseKey と組み合わせて使用されます。 この関数は、IClassFactory2::RequestLicKey の処理の過程でフレームワークによって呼び出されます。
-
アプリケーションに埋め込まれているキーとコントロールの一意のキーが一致しているかどうかを検査します。 一致している場合は、コンテナーでコントロールのインスタンスを作成して使用できます。 この関数は、IClassFactory2::CreateInstanceLic の処理の過程でフレームワークによって呼び出されます。この関数をオーバーライドすると、ライセンス キーの検査をカスタマイズできます。 既定の実装では、文字列の比較が行われます。 詳細については、この後の「ActiveX コントロールのライセンスのカスタマイズ」を参照してください。
ヘッダー ファイルの変更
ActiveX コントロール ウィザードは、コントロールのヘッダー ファイルに次のコードを追加します。 この例では、CSampleCtrl のオブジェクト factory の 2 つのメンバー関数が宣言されます。一方のメンバー関数は、コントロールの .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 ファイルの最初の行も変更しないと、ライセンスが正しく機能しません。
さらに、次のコードも追加されます。このコードは、コントロール クラスの 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);
}
最後に、コントロール プロジェクトの .IDL ファイルが変更されます。 次のように、licensed キーワードがコントロールのコクラス宣言に追加されます。
[ uuid(913E450B-E720-4C71-BCDF-71C96EE98FEB), licensed,
helpstring("MyAxUI Control"), control ]
coclass NVC_MFC_AxUI
ActiveX コントロールのライセンスのカスタマイズ
VerifyUserLicense、GetLicenseKey、および VerifyLicenseKey はコントロールのファクトリ クラスの仮想メンバー関数として宣言されるため、コントロールのライセンス付与機能をカスタマイズできます。
たとえば、メンバー関数の VerifyUserLicense または VerifyLicenseKey をオーバーライドすると、コントロールに複数のレベルのライセンスを用意できます。 この関数で、検出したライセンス レベルに応じて、ユーザーに公開するプロパティやメソッドを調整できます。
また、VerifyLicenseKey 関数には、コントロールの作成が失敗したことを独自の方法でユーザーに知らせるコードを追加することもできます。コードを追加して、コントロールの作成の失敗をカスタマイズしたメソッドでユーザーに知らせることもできます。 たとえば、コントロールの初期化が失敗したことおよびその理由を知らせるメッセージ ボックスを表示できます。
注意
ActiveX コントロールのライセンス検査をカスタマイズする方法としては、この他にも、AfxVerifyLicFile を呼び出す代わりに特定のレジストリ キーを確認するという方法もあります。 既定の実装の例については、上の「実装ファイルの変更」を参照してください。
ライセンスの詳細については、「既存の ActiveX コントロールのアップグレード」の「ライセンスの問題」を参照してください。