MFC ActiveX コントロール : ActiveX コントロールのライセンス
更新 : 2007 年 11 月
ActiveX コントロールのオプション機能であるライセンス サポートを使うと、コントロールを使用または配布できるユーザーを制御できます。ライセンスの詳細については、「既存の ActiveX コントロールのアップグレード」の「ライセンスの問題」を参照してください。
ここでは、次のトピックについて説明します。
ActiveX コントロールのライセンスの概要
ライセンス コントロールの作成
ライセンス サポート
ActiveX コントロールのライセンスのカスタマイズ
ライセンスを実装する ActiveX コントロールでは、ユーザーのコントロールの利用方法を開発者が制御できます。コントロールの購入者にコントロールと .LIC ファイルを契約付きで提供し、購入者はアプリケーションと一緒にコントロールを配布できるが、.LIC ファイルは配布できないようにすることが可能です。購入者が開発したアプリケーションのユーザーは、コントロールの開発者からコントロールのライセンスを受けない限り、そのコントロールを使用する新しいアプリケーションを作成することはできません。
ActiveX コントロールのライセンスの概要
ActiveX コントロールのライセンス サポートを提供するために、COleObjectFactory クラスによって、IClassFactory2::RequestLicKey、IClassFactory2::GetLicInfo、IClassFactory2::CreateInstanceLic の各関数が IClassFactory2 インターフェイスに実装されます。コンテナ アプリケーションの開発者がコントロールのインスタンスの作成を要求すると、GetLicInfo が呼び出されて、コントロールの .LIC ファイルがあるかどうかが確認されます。ライセンスが許諾されているコントロールの場合は、コントロールのインスタンスを作成してコンテナに配置できます。コンテナ アプリケーションの生成が完了すると、今度は RequestLicKey が呼び出されます。この関数は、ライセンス キー (単純な文字列) をコンテナ アプリケーションに返します。返されたキーは、アプリケーションに埋め込まれます。
下の図は、コンテナ アプリケーションの開発中に行われる ActiveX コントロールのライセンス検査を表しています。上で説明したように、開発コンピュータに正しい .LIC ファイルがインストールされていないと、コンテナ アプリケーションの開発者はコントロールのインスタンスを作成できません。
開発時の ActiveX コントロールのライセンス検査
次に、エンド ユーザーがコンテナ アプリケーションを実行すると、下の図に示す状態になります。
一般に、アプリケーションの起動時にはコントロールのインスタンスを作成する必要があります。コンテナは、コントロールのインスタンスを作成するために、埋め込まれているライセンス キーをパラメータとして CreateInstanceLic を呼び出します。その後、埋め込まれているライセンス キーとコントロール自体のライセンス キーのコピーとの間で文字列比較が行われます。両者が一致していた場合は、コントロールのインスタンスが作成され、アプリケーションが通常どおりに実行されます。コントロールのユーザーのコンピュータには、.LIC ファイルがなくてもかまいません。
実行時の ActiveX コントロールのライセンス検査
コントロールのライセンスは、コントロールの実装 DLL に含まれる特定のコードとライセンス ファイルという 2 つの基本コンポーネントから構成されています。この 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 コントロールのアップグレード」の「ライセンスの問題」を参照してください。