MFC ActiveX コントロール : ActiveX コントロールのライセンス

更新 : 2007 年 11 月

ActiveX コントロールのオプション機能であるライセンス サポートを使うと、コントロールを使用または配布できるユーザーを制御できます。ライセンスの詳細については、「既存の ActiveX コントロールのアップグレード」の「ライセンスの問題」を参照してください。

ここでは、次のトピックについて説明します。

  • ActiveX コントロールのライセンスの概要

  • ライセンス コントロールの作成

  • ライセンス サポート

  • ActiveX コントロールのライセンスのカスタマイズ

ライセンスを実装する ActiveX コントロールでは、ユーザーのコントロールの利用方法を開発者が制御できます。コントロールの購入者にコントロールと .LIC ファイルを契約付きで提供し、購入者はアプリケーションと一緒にコントロールを配布できるが、.LIC ファイルは配布できないようにすることが可能です。購入者が開発したアプリケーションのユーザーは、コントロールの開発者からコントロールのライセンスを受けない限り、そのコントロールを使用する新しいアプリケーションを作成することはできません。

ActiveX コントロールのライセンスの概要

ActiveX コントロールのライセンス サポートを提供するために、COleObjectFactory クラスによって、IClassFactory2::RequestLicKeyIClassFactory2::GetLicInfoIClassFactory2::CreateInstanceLic の各関数が IClassFactory2 インターフェイスに実装されます。コンテナ アプリケーションの開発者がコントロールのインスタンスの作成を要求すると、GetLicInfo が呼び出されて、コントロールの .LIC ファイルがあるかどうかが確認されます。ライセンスが許諾されているコントロールの場合は、コントロールのインスタンスを作成してコンテナに配置できます。コンテナ アプリケーションの生成が完了すると、今度は RequestLicKey が呼び出されます。この関数は、ライセンス キー (単純な文字列) をコンテナ アプリケーションに返します。返されたキーは、アプリケーションに埋め込まれます。

下の図は、コンテナ アプリケーションの開発中に行われる ActiveX コントロールのライセンス検査を表しています。上で説明したように、開発コンピュータに正しい .LIC ファイルがインストールされていないと、コンテナ アプリケーションの開発者はコントロールのインスタンスを作成できません。

開発時の ActiveX コントロールのライセンス検査
ライセンスされた ActiveX コントロール開発の検証

次に、エンド ユーザーがコンテナ アプリケーションを実行すると、下の図に示す状態になります。

一般に、アプリケーションの起動時にはコントロールのインスタンスを作成する必要があります。コンテナは、コントロールのインスタンスを作成するために、埋め込まれているライセンス キーをパラメータとして CreateInstanceLic を呼び出します。その後、埋め込まれているライセンス キーとコントロール自体のライセンス キーのコピーとの間で文字列比較が行われます。両者が一致していた場合は、コントロールのインスタンスが作成され、アプリケーションが通常どおりに実行されます。コントロールのユーザーのコンピュータには、.LIC ファイルがなくてもかまいません。

実行時の ActiveX コントロールのライセンス検査
ライセンスされた ActiveX コントロール実行の検証

コントロールのライセンスは、コントロールの実装 DLL に含まれる特定のコードとライセンス ファイルという 2 つの基本コンポーネントから構成されています。この DLL 内のコードは、2 つ (または 3 つ) の関数呼び出しと著作権表記の文字列で構成されています。この文字列をこれより "ライセンス文字列" と呼びます。これらの関数呼び出しとライセンス文字列は、コントロールの実装 (.CPP) ファイルにあります。ActiveX コントロール ウィザードによって生成されるライセンス ファイルは、著作権表記を含むテキスト ファイルです。このファイルの名前は、プロジェクト名に拡張子 .LIC が付いたものになります (SAMPLE.LIC など)。ライセンス コントロールをデザイン時に使用する場合には、ライセンス ファイルが必要です。

ライセンス コントロールの作成

ActiveX コントロール ウィザードを使ってコントロール フレームワークを作成するときに、ライセンス サポートを簡単に追加できます。コントロールにランタイム ライセンスが必要であることを指定すると、ライセンスをサポートするためのコードがコントロール クラスに自動的に追加されます。追加されるコードは、キーとライセンス ファイルを使ってライセンスを検査する関数で構成されています。これらの関数を変更して、コントロールのライセンスをカスタマイズすることもできます。ライセンスのカスタマイズの詳細については、この後の「ActiveX コントロールのライセンスのカスタマイズ」を参照してください。

コントロール プロジェクトの作成時に ActiveX コントロール ウィザードでライセンス サポートを追加するには

  • MFC ActiveX コントロールの作成」の手順に従います。ActiveX コントロール ウィザードの [アプリケーションの設定] ページに、ランタイム ライセンスを持つコントロールを作成するためのオプションがあります。

ActiveX コントロール ウィザードによって、基本的なライセンス サポートを備えた ActiveX コントロール フレームワークが生成されます。ライセンス コードの詳細については、次のトピックを参照してください。

ライセンス サポート

ActiveX コントロール ウィザードを使って ActiveX コントロールにライセンス サポートを追加すると、ライセンス機能の宣言および実装のためのコードがコントロールのヘッダー ファイルと実装ファイルに追加されます。このコードは、VerifyUserLicense メンバ関数と GetLicenseKey メンバ関数で構成されています。これらのメンバ関数は、COleObjectFactory の既定の実装をオーバーライドします。これらの関数によって、コントロールのライセンスの取得および検査が行われます。

9dwf178y.alert_note(ja-jp,VS.90).gifメモ :

ここで紹介するもう 1 つのメンバ関数 VerifyLicenseKey は、ActiveX コントロール ウィザードによって生成されませんが、このメンバ関数をオーバーライドすると、ライセンス キーの検査方法をカスタマイズできます。

各メンバ関数の機能は次のとおりです。

  • VerifyUserLicense

    システム内にコントロールのライセンス ファイルがあるかどうかを確認することによって、デザイン時のコントロールの使用が許可されているかどうかを検査します。この関数は、IClassFactory2::GetLicInfoIClassFactory::CreateInstanceLic の処理の過程でフレームワークによって呼び出されます。

  • GetLicenseKey

    コントロールの DLL から一意のキーを要求します。受け取ったキーは、コンテナ アプリケーションに埋め込まれ、後にコントロールのインスタンスを作成するときに VerifyLicenseKey と組み合わせて使用されます。この関数は、IClassFactory2::RequestLicKey の処理の過程でフレームワークによって呼び出されます。

  • VerifyLicenseKey

    アプリケーションに埋め込まれているキーとコントロールの一意のキーが一致しているかどうかを検査します。一致している場合は、コンテナでコントロールのインスタンスを作成して使用できます。この関数は、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 ";
9dwf178y.alert_note(ja-jp,VS.90).gifメモ :

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 コントロールのライセンスのカスタマイズ

VerifyUserLicenseGetLicenseKey、および VerifyLicenseKey はコントロールのファクトリ クラスの仮想メンバ関数として宣言されるため、コントロールのライセンス付与機能をカスタマイズできます。

たとえば、メンバ関数の VerifyUserLicense または VerifyLicenseKey をオーバーライドすると、コントロールに複数のレベルのライセンスを用意できます。この関数で、検出したライセンス レベルに応じて、ユーザーに公開するプロパティやメソッドを調整できます。

また、VerifyLicenseKey 関数には、コントロールの作成が失敗したことを独自の方法でユーザーに知らせるコードを追加することもできます。コードを追加して、コントロールの作成の失敗をカスタマイズしたメソッドでユーザーに知らせることもできます。たとえば、コントロールの初期化が失敗したことおよびその理由を知らせるメッセージ ボックスを表示できます。

9dwf178y.alert_note(ja-jp,VS.90).gifメモ :

ActiveX コントロールのライセンス検査をカスタマイズする方法としては、この他にも、AfxVerifyLicFile を呼び出す代わりに特定のレジストリ キーを確認するという方法もあります。既定の実装の例については、上の「実装ファイルの変更」を参照してください。

ライセンスの詳細については、「既存の ActiveX コントロールのアップグレード」の「ライセンスの問題」を参照してください。

参照

概念

MFC ActiveX コントロール

参照

MFC ActiveX コントロール ウィザード