ライセンスと IClassFactory2

クラス オブジェクトの IClassFactory インターフェイスは、COM の基本的なオブジェクト作成メカニズムを提供します。 IClassFactory を使用すると、サーバーはマシンごとにオブジェクトの作成を制御できます。 IClassFactory::CreateInstance メソッドの実装では、マシン ライセンスの存在に基づいてオブジェクトの作成を許可または禁止できます。 マシン ライセンスは、マシン上に存在するアプリケーションとは別の情報で、ソフトウェアがベンダーのインストール ディスクなどの有効なソースからインストールされたことを示します。 マシン ライセンスが存在しない場合、サーバーはオブジェクトの作成を禁止できます。 マシン ライセンスによって、ユーザーがあるマシンから別のマシンにソフトウェアをコピーしようとした場合の著作権侵害が防止されます。これは、ライセンス情報がソフトウェアとともにコピーされず、コピーを受信するマシンにはライセンスが付与されていないためです。

ただし、コンポーネント ソフトウェア業界では、ベンダーはライセンスを細かく制御する必要があります。 マシンのライセンス制御に加えて、ベンダーは一部のクライアントにコンポーネント オブジェクトの作成を許可し、他のクライアントには同じ機能を拒否する必要があります。 これには、クライアント アプリケーションが開発中にコンポーネントからライセンス キーを取得する必要があります。 クライアント アプリケーションは、実行時にライセンス キーを使用して、ライセンスのないマシン上にオブジェクトを作成します。

たとえば、ベンダーが開発者にコントロールのライブラリを提供する場合、そのライブラリを購入する開発者はフル マシン ライセンスを取得し、開発マシン上でオブジェクトを作成できるようになります。 その後、開発者は、1 つ以上のコントロールを組み込んだクライアント アプリケーションをライセンスを取得したマシン上に構築できます。 作成されたクライアント アプリケーションが別のマシンで実行される場合、そのマシンが元のベンダーからコントロールのマシン ライセンスを所有していない場合でも、クライアント アプリケーションで使用されるコントロールは別のマシン上に作成する必要があります。

IClassFactory2 インターフェイスはこのレベルの制御を提供します。 特定のコンポーネントのキーベースのライセンスを許可するには、そのコンポーネントのクラス ファクトリ オブジェクトに IClassFactory2 を実装します。 IClassFactory2IClassFactory から派生しているため、IClassFactory2 を実装することで、クラス ファクトリ オブジェクトは基本的な COM 要件を満たします。

ライセンスされたコンポーネントをクライアント アプリケーションに組み込むには、IClassFactory2 で次のメソッドを使用します。

  • GetLicInfo メソッドは、クラス ファクトリのライセンス動作を記述する情報を LICINFO 構造体に格納します。 たとえば、fRunTimeKeyAvail メンバーが TRUE の場合、クラス ファクトリはランタイム ライセンスのライセンス キーを提供できます。
  • RequestLicKey メソッドは、コンポーネントのライセンス キーを提供します。 クライアントがこのメソッドを呼び出すときは、マシン ライセンスを使用できる必要があります。
  • CreateInstanceLic メソッドは、ライセンス キー パラメーター (BSTRÂ bstrKey) が有効な場合に、ライセンスされたコンポーネントのインスタンスを作成します。

Note

コンポーネントの型情報では、ライセンスされた属性を使用して、IClassFactory2 によるライセンスをサポートするコクラスをマークします。

 

まず、ライセンスコンポーネントのクライアントでもある別の開発ツールが必要です。 このツールの目的は、ランタイム ライセンス キーを取得し、クライアント アプリケーションに保存することです。 このツールは、コンポーネントのマシン ライセンスを持つマシンでのみ実行されます。 このツールは GetLicInfo メソッドと RequestLicKey メソッドを呼び出してランタイム ライセンス キーを取得し、そのライセンス キーをクライアント アプリケーションに保存します。 たとえば、開発ツールは BSTR ライセンス キーを含むヘッダー (.h) ファイルを作成し、その .h ファイルをクライアント アプリケーションに含めることができます。

クライアント アプリケーション内でコンポーネントをインスタンス化するには、まず IClassFactory::CreateInstance を使用して、オブジェクトを直接インスタンス化してみてください。 CreateInstance が成功した場合、2 番目のマシンにはコンポーネントのライセンスが付与され、オブジェクトは必要に応じて作成できます。 CreateInstance が戻りコード CLASS_E_NOTLICENStandard Edition D で失敗した場合、オブジェクトを作成する唯一の方法は、CreateInstanceLic メソッドにランタイム キーを渡すことです。 CreateInstanceLic はキーを検証し、キーが有効な場合はオブジェクトを作成します。

このようにして、コンポーネント (コントロールなど) で構築されたアプリケーションは、他のライセンスを持たないマシン上で実行できます。ランタイム ライセンスを含むクライアント アプリケーションのみが、問題のコンポーネント オブジェクトを作成できます。

IClassFactory2 インターフェイスは、ライセンス スキームの柔軟性をサポートします。 たとえば、サーバー実装者は、セキュリティを強化するためにコンポーネント内のライセンス キーを暗号化できます。 サーバー実装者は、機能ごとに異なるライセンス キーを提供することで、オブジェクトの機能レベルを有効または無効にすることもできます。 たとえば、あるキーでは基本レベルの機能が許可され、別のキーでは基本機能と高度な機能が許可されるなどです。

COM サーバーの責任