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é アクティベートの使用法

この章では、ActiveX コンポーネントの Caché ラッパ・クラスを生成する方法、およびアプリケーションをそのラッパ・クラスで使用する方法について説明します。

Caché アクティベート・ウィザード

Caché アクティベート・ウィザードは、ActiveX インタフェースの任意のセットに対し 1 つ以上のラッパ・クラスを自動的に生成します。

ウィザード使用法

  1. Atelier を開始します。

  2. 目的のアプリケーションのプロジェクトを選択します。

  3. メイン・メニューから [ツール]→[アドイン...] を選択して、[次へ] ボタンをクリックします。

  4. [標準アドイン] 項目を展開して、[アクティベートウィザード] を選択します。

  5. [完了] ボタンをクリックして、アクティベート・ウィザードを開始します。

    generated description: actwiz1

    生成されるクラスに使用するパッケージ名を入力し、[次へ] ボタンをクリックします。

  6. ウィザードは、利用できる COM インタフェースのリストを表示します (これらは、Atelier を実行しているマシン上ではなく、Caché サーバ上で利用できるインタフェースです)。

    generated description: actwiz2

    1 つ以上のインタフェースを選択して [次へ] ボタンをクリックします。

  7. ウィザードは、指定されたパッケージ内にラッパ・クラスを自動的に生成し、これをコンパイルします。

    generated description: actwiz3

Note:
64 ビット ActiveX コントロール

64 ビット・キャッシュを持つ 64 ビット・バージョンの Windows では、64 ビット ActiveX コントロールを呼び出すことができます。これによって 64 ビット・キャッシュで 32 ビット ActiveX コントロールを使用することはできなくなります (これはオペレーティング・システムの制約により不可能です)。ただし、一部の企業は現在、既存の 32 ビット・コントロールの 64 ビット・バージョンをリリース中で、これにより顧客は 64 ビット・システムに移行できます。

生成されたラッパ・クラスの使用法

Caché で生成されるクラスは、COM オブジェクトのプロキシ・クラスです。いったん、クラスが生成されコンパイルされると、Caché アプリケーション内でこれを使用できます。

例えば、アクティベート・ウィザードを使用して、システム・リソースに関する情報を提供する Microsoft SysInfo Control のラッパ・クラスを生成することができます。

Caché アクティベート・ウィザードは、SysInfo COM オブジェクトに対し、以下のクラスを生成します。

  • Activate.SysInfoLib.ISysInfo — ISysInfo インタフェースが提供するメソッドやプロパティを定義する抽象インタフェース・クラス。これは、インスタンス化することはできません。

    BatteryLifePercent と呼ばれる計算プロパティと、そのプロパティに対応する get メソッドと set メソッドを含みます。

  • Activate.SysInfoLib.SysInfoISysInfo クラスから継承する具象クラス。これに含まれるコードは、外部 COM オブジェクトを見つけてインスタンス化し、そのオブジェクトへの “接続” を維持します。ユーザは、この具象クラスを使用して外部オブジェクトを操作します。オブジェクトを閉じると、外部 COM オブジェクトも閉じます (解除されます)。

例 : プロパティへのアクセス

ここでは、SysInfo ラッパ・オブジェクトを使用して、ラップトップ・コンピュータに残っているバッテリの割合を取得します。

 Set obj = ##class(Activate.SysInfoLib.SysInfo).%New()
 Write obj.BatteryLifePercent,!
 Set obj = ""

このオブジェクトは、Caché 内のあらゆるオブジェクトと同じ方法で生成されます。The BatteryLifePercent プロパティが書き出され、最後にオブジェクトを閉じます。

例 : 列挙 COM インタフェース

Caché アクティベート・ウィザードは、TL.dll と呼ばれる COM オブジェクトを使用して、Caché サーバ上でタイプ・ライブラリを列挙します (64 ビット・システムの場合は TL64.dll。このファイルは <CacheRoot>\Bin ディレクトリに置かれ、Caché インストール時に自動的に登録されます)。このオブジェクトから生成される Caché クラスは、%Activate.TLLib パッケージに事前にロードされます。

これらのクラスは、以下から構成されます。

  • %Activate.TLLib.IUtilsOpens in a new tab — ILibraries タイプの 1 つのプロパティおよびライブラリを持つ抽象インタフェース・クラス。このプロパティを使用して、システムのタイプ・ライブラリを列挙する ILibraries インタフェースを取得します。

  • %Activate.TLLib.ILibrariesOpens in a new tabCount プロパティおよび Item プロパティを公開する抽象インタフェース・クラス。これらのプロパティを使用して、システムのタイプ・ライブラリを列挙します。

  • %Activate.TLLib.UtilsOpens in a new tabIUtils インタフェースを表す具象サブクラス。このクラスをインスタンス化して、Libraries プロパティにアクセスします。

以下は、これらのクラスを使用してシステムのタイプ・ライブラリを列挙する ObjectScript メソッドの例です。Utils クラスの具象インスタンスを生成し、objlibs プロパティを取得します。Caché は現在、計算インデックス・プロパティをサポートしないため、Item プロパティは ItemGet メソッド経由で呼び出されることに注意してください。

Class MyApp.ActivateTest
{
// ...

/// Demonstrate COM object Access and provide type library enumeration  ;
ClassMethod ListTypeLibs() {
    Set objUtils = ""
    Set objLibs = ""
    Set $ZT = "tlerr"
    Set objUtils = ##class(%Activate.TLLib.Utils).%New()
    Set objLibs = objUtils.Libraries
    For i = 1:1:objLibs.Count {
       Set tld = objLibs.ItemGet(i)
       // tld is a | delimited string
       Write !, $Piece(tld,"|"), !, $Piece(tld,"|",2), !, $Piece(tld,"|",3), !!
    }

xit      ; Exit point          
    If objLibs'="" Set objLibs = ""
    If objUtils'="" Set objUtils = ""
    Quit

tlerr      ; Exception handler
    Set $ZT = ""
    Goto xit
}
}

プロパティに関する特別な考慮事項

前述の例にあるとおり、COM では、一部の プロパティ はパラメータを持ちます。さらに、“既定プロパティ” を持つオブジェクトもあります。つまり、プロパティ名を明示的に指定しないで、そのプロパティを参照することができます。

例えば、(上記の例にあるように) コレクションは常に Count プロパティと Item プロパティを持ちます。ここで Item プロパティは (明らかに) メソッドではありませんが、引数を持ちます。Item プロパティは、コレクションの既定プロパティである場合もあります。例えば Microsoft Excel にワークブックの集合がある場合、Visual Basic で名前を指定したワークブックに以下のようにアクセスできます。

Application.Workbooks("Sheet1")

“Sheet1” という Item にアクセスしているにもかかわらず、Item は明示的に参照されていません。コードが実際に実行しているのは、以下の呼び出しです。

Application.Workbooks.Item("Sheet1")

Caché は括弧の有無によって、メソッド呼び出しとプロパティの参照を区別します。つまり、“person.Name” はプロパティで、“person.RaiseSalary()” はメソッドに解釈されます。これにより、既定プロパティが扱いにくくなります。Caché は Visual Basic とは異なり、既定パラメータを定義する機能も、パラメータを渡す間にプロパティを参照する機能も備えていないためです。 例えば、Caché では、プロパティを暗黙的に参照する以下の Visual Basic 構文がサポートされません。

Workbooks("Sheet1") ' Implicit reference to Item property

また、Item がプロパティである以下の構文もサポートされません。

Workbooks.Item("Sheet1") ' Item is a property!

Caché インタープリタによって Item がメソッドに解釈されるため、この構文は機能しません。 この言語間の違いに対応するには、以下の構文を使用します。

Workbooks.ItemGet("Sheet1")

この構文が機能する理由は、ItemGet が Item プロパティを取得するメソッドであるためです。

例外処理

COM オブジェクトは、メソッド呼び出し、あるいはプロパティの設定や取得などの操作の結果として、例外を引き起こすことがあります。例外が発生すると、例外は ZTrap 機能を通して Caché に伝搬されます。呼び出しコードは、エラー・コード <ZACTX> というエラーを受け取り、ローカル変数 %objlasterror はエラーの完全な詳細テキストを含みます。プログラマはこのエラーを考慮し、適切に対応する必要があります。

例 : 例外処理

以下は、FTP によってファイルを取得する COM オブジェクトの使用例です。オブジェクトを生成し、CurrentDirectory プロパティを問い合わせます。FTP 接続が確立する前に現在のディレクトリを指定しようとすると無効になるため、COM オブジェクトは例外を発生します。Caché コマンド行 (ターミナル・セッション) からこれを試行します。

 Set obj = ##class(Activate.RETRIEVERLib.FtpRetriever).%New()
 Write obj.CurrentDirectory

この場合、上記はエラーを発生します。

<ZACTX>CurrentDirectoryGet+4^Activate.RETRIEVERLib.FtpRetriever.1

<ZATCX> エラーに関連するエラー・コードは、ローカル変数 %objlasterror 内にあります。以下の $system.OBJ.DisplayError を呼び出して、エラー・メッセージの完全なテキストを取得することもできます。

 Do $system.OBJ.DisplayError(%objlasterror)

その結果、以下が出力されます。

ERROR #1101: Com Exception: '-2147220888 Ftp Retriever Connection must
be established before attempting this operation'

%Activate.IDispatch および %Activate.GenericObject

COM オブジェクトにはタイプ・ライブラリがないものや、COM オブジェクトのメソッド・タイプ、プロパティ・タイプの返りタイプが IDispatch インタフェースであるものもあります。そのようなオブジェクトに対するメソッドを呼び出し、プロパティにアクセスする方法について、以下で説明します。

Caché アクティベートはこの問題を解決するために、%Activate.IDispatchOpens in a new tab%Activate.GenericObjectOpens in a new tab という 2 つのクラスを提供します。

多くの COM オブジェクトは、いわゆる “ProgId” により識別されます。“ ProgId” は、通常ライブラリ名、またはオブジェクト名から成る文字列で、オブジェクトの識別に使用します。Visual Basic には CreateObject 呼び出しがあります。 これは Progid を取得し、オブジェクトの操作に使用するオブジェクト参照を返します。Caché は、%Activate.GenericObjectOpens in a new tab クラスのクラス・メソッドとして CreateObject メソッドも提供します。これは、以下のように使用します。

例 : CreateObject の使用法

上記と同じ Microsoft SysInfo オブジェクトを使用して、ProgId 経由でオブジェクトをインスタンス化します。この方法でインスタンス化すると、このオブジェクトに対するタイプ情報がない (汎用オブジェクトである) ため、IDispatch インタフェースから汎用メソッドを呼び出す必要があります。このインタフェースは、名前によってプロパティを取得、設定し、メソッドを呼び出します。

 Set obj = ##class(%Activate.GenericObject).CreateObject("SYSINFO.SysInfo")
 Write obj.GetProperty("BatteryLifePercent")
 Set obj = ""

モニカ

COM は ProgId の代わりにモニカを使用して、オブジェクトを間接的にインスタンス化する別の方法も提供します。Visual Basic は GetObject 呼び出しを提供します。これはモニカを取得し、オブジェクトの操作に使用するオブジェクト参照を返します。Caché は、%Activate.GenericObjectOpens in a new tab クラスのクラス・メソッドとして GetObject メソッドを提供します。これは、以下のように使用します。

例 : GetObject の使用法

以下は、アクティブ・ディレクトリ・サービスの LDAP プロトコルにアクセスするモニカです。現在のドメインのユーザを表すノードの集合への参照を返すために使用します。ユーザの数が書き出され、オブジェクトを閉じます。

 Set obj = ##class(%Activate.GenericObject).GetObject("LDAP://CN=USERS")
 Write obj.Count()
 Set obj = ""

Become メソッド

タイプ・ライブラリは、汎用 IDispatch インタフェースの返りタイプを持つメソッドやプロパティを指定する場合があります。ユーザが受け取るのは %Activate.IDispatchOpens in a new tab のインスタンスで、その上ではプロパティの取得や設定、メソッドの呼び出しのために (GetProperty などの) 汎用メソッドを使用する必要があるため、非常に不便です。(ドキュメントやその他から) 本当に必要なインタフェースが 分かっている場合 は、%Activate.IDispatchOpens in a new tab オブジェクトのインスタンスの Become メソッドを呼び出し、タイプが指定された新規のインタフェースを取得することができます。Become メソッドは、引数としてクラス名を持ちます。事実上、%Activate.IDispatchOpens in a new tab が、ユーザがメソッドに渡したクラス名のインスタンスになります。呼び出されたオブジェクトが新規にタイプを指定されたインタフェースをサポートしていない場合、Become は例外を返します。

イベント

COM コンポーネントには、メソッドの処理中にイベントを引き起こす機能を持つものがあります。 そのイベントは、イベント、あるいは任意の名前の “ソース” ・インタフェースにグループ化されます。例えば、MyClass という COM オブジェクトを与えられた場合、インタフェースは “MyClassEvents” と呼ばれ、Visual Basic で生成された COM オブジェクトならば “__MyClass” と呼ばれます。

Caché アクティベートは、%Activate.RegisterEventsOpens in a new tab%Activate.HandleEventsOpens in a new tab という 2 つのクラスを介してイベント処理を提供します。COM オブジェクトがイベントを発生する場合には、生成された Caché クラスは %Activate.RegisterEventsOpens in a new tab インタフェース・クラスを継承します。これは、%RegisterHandler%UnRegisterHandler の 2 つのメソッドを追加します。通常の COM オブジェクトのプロキシ・クラスに加え、Event インタフェースを表す別のクラスが生成されます。これは %Activate.HandleEventsOpens in a new tab を継承し、event インタフェースにより定義される特定のイベントを処理するメソッドや %Advise および %UnAdvise メソッドを実装します。

例 : COM イベントの使用法

以下で例を使用して、分かりやすく説明します。FTP 転送を実行する仮想 COM オブジェクトを持つとします。そのオブジェクトは、ConnectCloseDownload などのメソッドの実装に加え、BytesTransferred という 1 つのメソッドを表す Event インタフェースを実装します。接続に成功しダウンロードが開始すると、FTP オブジェクトは、1 キロバイトのデータをダウンロードするたびに “BytesTransferred” イベントを引き起こします。そのイベントは整数の Bytes と、参照により渡されるブーリアン値の Cancel という 2 つのパラメータを持つ BytesTransferred メソッドにより表されます。イベントが起こると、BytesTransferred メソッドが呼び出され、引数 BytesCancel の現在値を渡します。その後、これらの値を使用して処理を実行します。通常、Bytes 引数はユーザ・インタフェースを介して表示されます。Cancel 引数は参照により渡されるため、その値を設定してイベントを起こした COM オブジェクトに返すことができます。このインスタンスで、Cancel に True (COM では -1) を設定すると、現在の処理を中断し Download への呼び出しをすぐに返すように、COM オブジェクトに指示されます。通常どおりにダウンロードが完了すると、Download への呼び出しは呼び出し側に制御を返し、それ以上イベントは起こりません。 Caché では、FTP COM オブジェクトは生成されたクラス Activate.SomeLibrary.FTP やクラス Activate.SomeLibrary.FTPEvents によるイベント・インタフェースなどにより表されます。

この例は、以下のようになります。まず、FTP オブジェクトのインスタンスが生成されます。

 Set FTP = ##class(Activate.SomeLibrary.FTP).%New()

イベントを処理するために、イベント・ハンドラのインスタンスを生成します。

 Set FTPHandler = ##class(Activate.SomeLibrary.FTPEvents).%New()

イベントが処理される前に、イベント・ハンドラは実際にイベントを引き起こすオブジェクトに登録する必要があります。したがって、以下を呼び出します。

 Do FTP.%RegisterHandler(FTPHandler)

次に接続し、ダウンロードします。

 Do FTP.Connect("ftp.intersys.com")
 Do FTP.Download("/public/somefile.txt")

ダウンロード中に、Activate.SomeLibrary.FTPEvents クラスで以下のメソッドが呼び出されます。

Class MyApp.Test
{
//...

Method BytesTransferred(Bytes As %Integer,Cancel As %Boolean)
{
    //...
}
}
Note:

実際に BytesTransferred メソッドを実装するために、Activate.SomeLibrary.FTPEvents クラスを直接編集するか、あるいはクラスを分類して、サブクラスの実装を提供するか (推奨) は、開発者次第です。

ダウンロードの後、これ以上イベントを処理する必要がないため、ハンドラの登録を解除します。

 Do FTP.%UnRegisterHandler(FTPHandler)

その後、後処理をします。

 Set FTPHandler = ""
 Set FTP = ""
FeedbackOpens in a new tab