Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

はじめに

Caché アプリケーションは、Caché アクティベートによって Caché サーバ内から ActiveX (COM としても知られています) コンポーネントと簡単に相互運用することができます。ラッパ・クラスを使用すると、ActiveX コンポーネントは Caché オブジェクト・クラスのインスタンスとして使用可能になり、他のクラスと同じ方法で利用できます。Caché アクティベートは、外部 COM オブジェクトをインスタンス化し、これをネイティブの Caché オブジェクトであるかのように操作できる機能を提供します。

Note:

このドキュメントの中では、“ActiveX” と “COM” という用語は同じ意味で使用されています。

Caché アクティベートは、ActiveX をサポートするプラットフォームでのみ利用できます (32 ビットと 64 ビットの両バージョンの Microsoft Windows)。

Caché アクティベートは、以下のように動作します。

  1. Caché アクティベート・ウィザードを使用して、1 つ以上のラッパ・クラスを作成することができます。ラッパ・クラスは、ActiveX コンポーネントのインタフェースに対応するメソッドを提供する Caché クラスです。

  2. Caché アプリケーション内で、ActiveX ラッパ・クラスのインスタンスを生成できます。Caché アクティベートは、適切な ActiveX コンポーネントのインスタンスを、同じプロセス内に透過的に生成します。ユーザがラッパ・クラスのメソッドを呼び出すと、それらを適切な ActiveX インタフェースのメソッドへ自動的に送信します。

Caché 内で ActiveX コンポーネントを使用する際には、注意が必要です。Caché は、アプリケーション・コードが安全に実行できる環境を提供するように設計されています。すべての Caché サーバ・プロセスは、Caché 仮想マシンのインスタンスを実行し、他のサービス・プロセスから独立しているので、アプリケーション・エラーを安全に処理することができます。しかし、残念ながら ActiveX は安全なテクノロジではありません。ActiveX を誤って使用したり、不適切に実装された ActiveX コンポーネントを使用すると、メモリ・リークや予期できないアプリケーションのクラッシュが起こる可能性があります。重要なアプリケーション内で ActiveX コンポーネントを使用する場合は、コンポーネントのインタフェースを正しく使用すること、コンポーネントは徹底的にテストすることなどに細心の注意を払ってください。ご使用のアプリケーション内で使用する前に、Visual Basic などのツールでコンポーネントをテストすることをお勧めします。

アーキテクチャ

Caché アクティベートは、以下のコンポーネントから成ります。

  • Caché アクティベート・ウィザード : Caché サーバにある ActiveX コンポーネントから選択し、そのコンポーネントの Caché ラッパ・クラスを自動的に生成するための簡単なグラフィカル・インタフェースを提供します。Caché アクティベート・ウィザードにアクセスするには、Atelier 開発環境の [ツール] メニューにある [アドイン] 項目を選択します。アクティベート・ウィザードは、Windows システムでのみ使用できます。

  • Caché アクティベート・クラス階層 : ActiveX と通信するために、生成されたラッパ・クラスが使用するヘルパー・クラスです。

  • Caché ActiveX ゲートウェイ : Caché プロセスが ActiveX コンポーネントで処理 (ロード、メソッド呼び出し、リリース) を実行するために使用し、ロードする共有ライブラリ (DLL) です。

ActiveX / COM の概要

以下は、Caché に関連する ActiveX / COM コンポーネント・アーキテクチャの簡単な概要です。ご使用のアプリケーション内で ActiveX を活用するには、それに関する多くの書籍などを調べてください。

COM オブジェクトとは?

COM オブジェクトは、COM 仕様に従うコードで、クライアント・プログラムで使用される 1 つ以上のサービスを提供します。COM オブジェクトのうち、自動化の概念をサポートする特定のクラスは、VisualBasic、Delphi、Caché などの高レベルのプログラミング言語から簡単にアクセスできるように特別に設計されています。そのようなオートメーション・オブジェクトはダイナミック・リンク・ライブラリとして実装される場合があり、テキスト文字列の暗号化などの単純な関数を提供します。また、Microsoft Excel や Microsoft Word のように、さまざまな異なるサービスを提供する本格的なアプリケーションにもなります。

COM インタフェース

COM オブジェクトは、機能をインタフェースとして公開します。インタフェースは、ある特定の機能をカプセル化するメソッドとプロパティの集合です。例えば、ワード・プロセッシング・オブジェクトは、出力インタフェースとスペル・チェック・インタフェースを提供します。COM オブジェクトの各実装にはクラス ID 形式の一意の識別子が与えられ、公開する各インタフェースにも、インタフェース ID と呼ばれる一意の識別子があります。 いったん、特定のオブジェクトのクラス ID と要求されたインタフェースのインタフェース ID が判別されると、クライアント・アプリケーションは COM オブジェクトをインスタンス化し、要求されたインタフェースが提供するサービスを利用します。規約により、インタフェースの名前を記述する際には、先頭に大文字の “I” を付けます。例えば、SpellCheck インタフェースは ISpellCheck になります。

IDispatch インタフェース

異なるプログラミング言語は、バイナリ・レベルでは互換性を持たない異なる内部データ型を持ちます。例えば、Caché ローカル変数は、VisualBasic 文字列あるいは C++ 文字列のローカル変数とはまったく異なる実装を持ちます。したがって、C++ データ型から Caché 変数へ変換する、あるいはその逆に変換する必要があるので、1 つの言語から別の言語で記述されたオブジェクトの呼び出しが困難になります。この問題を解決し、異なるプログラミング言語との通信を可能にするために、VARIANT データ型の概念や IDispatch インタフェースが開発されました。

IDispatch は、メソッドまたはパラメータの名前を指定して適切な引数を渡すことにより、外部 COM オブジェクトのメソッドを呼び出したり、プロパティにアクセスする機能を提供します。引数は、Windows オペレーティング・システムがサポートする標準的なデータ型である VARIANT 型で表されます。COM オートメーションの使用をサポートするすべてのプログラミング言語は、この標準型を “認識できます”。

COM オブジェクトを生成し、IDispatch インタフェースを要求することにより、Caché のようなクライアント・プログラムまたは言語は、オブジェクトが公開する機能に簡単にアクセスできます。

IDispatch は COM オートメーション・オブジェクトにアクセスする汎用的な方法を提供しますが、本来は、プログラミング言語が内部的に利用し、その言語特有の構成要素を経由して、COM オブジェクト・サービスを提供するためのテクニックとして意図されているものです。つまり、高レベルの言語は IDispatch 呼び出しの詳細を抽象化し、外部オブジェクトを簡単に使用できるようなプログラミング言語構成を提供します。理想としては、そのような COM オブジェクトが、ネイティブのオブジェクトであるかのようにプログラミング環境で動作することです。Caché アクティベートでこれを実現するためには、COM オブジェクト・タイプ・ライブラリに含まれる情報を活用することが重要です。

タイプ・ライブラリ

すべてではありませんが、ほとんどの COM オートメーション・オブジェクトは、タイプやメソッド、プロパティの詳細などのメタ・データを、タイプ・ライブラリの形式で公開しています。タイプ・ライブラリは、バイナリ・リソースとして実行可能なファイル内で .DLL (ダイナミック・リンク・ライブラリ) に結合することも、.tlb などの拡張子を付けて別のファイルに存在することもできます。タイプ・ライブラリ内では、各オブジェクトはクラス ID として識別され、CoClass として認識されます。CoClass は、既定インタフェースと呼ばれる IDispatch 由来のインタフェースを 1 つ公開することができます(ソース・インタフェースと呼ばれる別のインタフェースがある場合もありますが、これは直接呼び出すことはできないので、今のところ無視しても問題ありません)。IDispatch 派生のインタフェースを実装しないオブジェクトもあり、これらは IDispatch ベースのメカニズムから呼び出すことができません。

Caché アクティベートは、その情報を読み取って解読し、定義されたメソッドやプロパティを公開した Caché クラスを生成します。タイプ・ライブラリには、1 つ以上の CoClass オブジェクトや多数の IDispatch 由来のインタフェース定義が含まれる可能性があります。CoClass は、既定インタフェースとしては複数の IDispatch 派生のインタフェースを公開しません。しかし、インタフェースを返す、あるいはインタフェースとしてタイプされるメソッドやプロパティを定義することは自由なので、多数のインタフェースがある可能性があります。実際、1 つの CoClass (オブジェクト) が機能豊富なオブジェクト・モデルを定義する場合に、よくそういうことがあります。例えば、ワード・プロセッシングについて考えてみます。これは、AboutBoxExit などのメソッドを持つ IApplication の既定のインタフェースを提供することができます。また、Documents と呼ばれるプロパティとして、ドキュメントの集合 (IDocuments*) を提供することも可能です。

Note:

多くの COM インタフェースはかなり複雑で、何百ものメソッドを含むものや、追加の COM オブジェクトをパラメータとして多数使用するものがあります。ご使用のアプリケーションが特定のインタフェースの小規模なサブセットだけを使用する場合、ユーザが実際に必要なインタフェースのみを公開し、オリジナルの COM コンポーネントのこれらのインタフェースに任意の要求を渡すために、ラッパ COM コンポーネント (例えば Visual Basic) を使用して構築するという方法をお勧めします。

FeedbackOpens in a new tab