次の方法で共有


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

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

重要

ActiveX は、新しい開発には使用すべきではないレガシ テクノロジです。 ActiveX に取って代わる最新のテクノロジの詳細については、「ActiveX コントロール」を参照してください。

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

ライセンスを実装する ActiveX コントロールを使用すると、コントロール開発者は、他のユーザーが ActiveX コントロールを使用する方法を決定できます。 コントロールの購入者には、コントロールと .LIC ファイルを提供します。購入者はコントロールをそのコントロールを使用する契約と共に配布できますが、.LIC ファイルは配布できません。 これにより、そのアプリケーションのユーザーが、コントロールを使用する新しいアプリケーションを作成できなくなり、まず提供者からコントロールのライセンスを取得することが必要になります。

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

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

次の図は、コンテナー アプリケーションの開発中に使用される ActiveX コントロールのライセンス検証を示しています。 前述のように、コンテナー アプリケーション開発者は、コントロールのインスタンスを作成するために、開発用コンピューターに適切な .LIC ファイルをインストールしておく必要があります。

Licensed ActiveX control verified at development.
開発時の ActiveX コントロールのライセンス検査

次の図に示す次のプロセスは、エンド ユーザーがコンテナー アプリケーションを実行するときに発生します。

アプリケーションが起動したら、通常、コントロールのインスタンスを作成する必要があります。 コンテナーは、CreateInstanceLic を呼び出してこれを実現し、埋め込みライセンス キーをパラメーターとして渡します。 その後、埋め込みライセンス キーとコントロールのライセンス キーの独自コピーの間で文字列比較が行われます。 一致が成功した場合、コントロールのインスタンスが作成され、アプリケーションは引き続き正常に実行されます。 .LIC ファイルはコントロール ユーザーのコンピューターに存在する必要はないことに注意してください。

Licensed ActiveX control verified at execution.
実行時の ActiveX コントロールのライセンス検査

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

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

ActiveX コントロール ウィザードを使用してコントロール フレームワークを作成する場合には、ライセンス サポートを含めることは簡単です。 コントロールに実行時ライセンスを設定する必要がある場合、ActiveX コントロール ウィザードは、ライセンスをサポートするためにコントロール クラスにコードを追加します。 このコードは、ライセンスの検証にキーとライセンス ファイルを使用する関数で構成されます。 さらにこれらの関数は、コントロールのライセンスをカスタマイズするために変更できます。 ライセンスのカスタマイズの詳細については、この記事の後のほうの「ActiveX コントロールのライセンスのカスタマイズ」をご覧ください。

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

  1. MFC ActiveX コントロールの作成」の手順に従ってください。 ActiveX コントロール ウィザードの「アプリケーション設定」ページには、実行時ライセンスを使用してコントロールを作成するオプションが含まれています。

ActiveX コントロール ウィザードは、基本ライセンス サポートを含む ActiveX コントロール フレームワークを生成するようになりました。 ライセンス コードの詳細な説明については、次のトピックをご覧ください。

ライセンス サポート

ActiveX コントロール ウィザードを使用して ActiveX コントロールにライセンス サポートを追加すると、ActiveX コントロール ウィザードは、ライセンス機能を宣言して実装するコードを、コントロール ヘッダーと実装ファイルに追加します。 このコードは、COleObjectFactory にある既定の実装をオーバーライドする VerifyUserLicense メンバー関数と GetLicenseKey メンバー関数で構成されます。 これらの関数は、制御ライセンスを取得して検証します。

Note

3 番目のメンバー関数 VerifyLicenseKey は、ActiveX コントロール ウィザードでは生成されませんが、ライセンス キーの検証動作をカスタマイズするためにオーバーライドできます。

これらのメンバー関数は次のとおりです。

  • VerifyUserLicense

    システムにコントロール ライセンス ファイルが存在するかをチェックして、コントロールで設計時の使用が許可されるのを確認します。 この関数は、IClassFactory2::GetLicInfoIClassFactory::CreateInstanceLic の処理の一部としてフレームワークによって呼び出されます。

  • GetLicenseKey

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

  • VerifyLicenseKey

    埋め込みキーとコントロールの一意キーが同じことを確認します。 これにより、コンテナーで使用するコントロールのインスタンスを作成できます。 この関数は、IClassFactory2::CreateInstanceLic 処理の一環としてフレームワークによって呼び出され、ライセンス キーのカスタマイズされた検証を提供するためにオーバーライドできます。 既定の実装では、文字列比較が実行されます。 詳細については、この記事の後のほうの「ActiveX コントロールのライセンスのカスタマイズ」をご覧ください。

ヘッダー ファイルの変更

ActiveX コントロール ウィザードでは、次のコードをコントロール ヘッダー ファイル内に配置します。 この例では、CSampleCtrl のオブジェクト factory の 2 つのメンバー関数が宣言されています。1 つはコントロール .LIC ファイルの存在を検証し、もう 1 つはコントロールを含むアプリケーションで使用されるライセンス キーを取得します。

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 ";

Note

いずれにしても szLicString を変更する場合は、コントロール .LIC ファイルの最初の行も変更する必要があります。そうしないとライセンスは正しく機能しません。

ActiveX コントロール ウィザードでは、コントロール クラス VerifyUserLicenseGetLicenseKey 関数を定義するために、次のコードをコントロール実装ファイル内に配置します。

// 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 ファイルが変更されます。 次の例のように、licensed キーワードがコントロールのコクラス宣言に追加されます。

[uuid(913E450B-E720-4C71-BCDF-71C96EE98FEB), licensed,
helpstring("MyAxUI Control"), control]
coclass NVC_MFC_AxUI

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

VerifyUserLicenseGetLicenseKeyVerifyLicenseKey は、コントロール ファクトリ クラスの仮想メンバー関数として宣言されています。そのため、コントロールのライセンス動作をカスタマイズできます。

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

また、コントロールの作成が失敗したことをユーザーに通知するカスタマイズされたメソッドを提供するコードを VerifyLicenseKey 関数に追加できます。 たとえば、VerifyLicenseKey メンバー関数で、コントロールの初期化に失敗したこととその理由を示すメッセージ ボックスを表示できます。

Note

ActiveX コントロール ライセンスの検証をカスタマイズするもう 1 つの方法は、AfxVerifyLicFile を呼び出す代わりに、登録データベースで特定のレジストリ キーを確認することです。 既定の実装の例については、この記事の「実装ファイルの変更」のセクションをご覧ください。

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

関連項目

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