COMインターフェイスを通したAsprovaの機能の拡張

本記事のポイント

市販のERPシステムやAPSシステムでは、ソースコードは公開しない代わりに、COMインターフェイスを公開し、Standard EXEファイルやプラグイン(DLL)で機能を拡張することができるようにしています。
Wordpressと同じようにAsprovaのプラグインも単体では動作せず、本体のソフトウェアに追加しなければ機能しません。

Asprova本体は、イベントの発生タイミングにプラグインを実行させるためのHookを用意しており、このイベントを表すアクセスポイントであるプラグインキーがWordpressのdo_actionフックまたはapply_filtersフックに該当します。

WordPressのプラグイン追加の概要は「Wordpressのプラグイン開発とは」に記載しています。

COMインターフェイスとは

AsprovaはCOM (Component Object Model)で内部のデータや処理内容を公開する仕組みをもっており、プラグイン(ActiveX DLLファイル:Asprovaから関数呼び出し)やオートメーションクライアント(Standard EXEファイル:外部プログラムからAsprovaにアクセス)から機能追加することができます。

DLLファイルはAsprovaのEXEと同じフォルダに配置され、起動時にAsprovaに自動的に読み込まれます。

DLLはAsprovaの内部コマンドとして登録されますので、ユーザー定義メニューにくっつけてAsprovaからDLLを呼び出しますが、EXEの場合はプロジェクトファイルの名前を指定して開くことでアクティブなプロジェクトを取得します(DLLまたはEXEからのAsprovaプロジェクトオブジェクト取得方法)。

 

DLLの配置場所

DLLは起動するEXEから見て以下の場所に配置する必要があります。

  1. EXEとDLLを同じディレクトリに配置する。
  2. EXEを起動する際にDLLのディレクトリをカレントディレクトリとして起動する。
  3. DLLをsystem32ディレクトリに配置する。
  4. DLLをWindowsディレクトリに配置する。
  5. Path環境変数にDLLの配置しているディレクトリを設定する。

開発環境の参照設定(プラグイン内からAsprovaのライブラリを使用)

参照設定はGUIを持たないActiveXオブジェクトのタイプライブラリをプロジェクトで利用するためにプロジェクトファイル(.vbpファイル)内に保存され、プラグイン(プロジェクトファイルをコンパイルしたDLL)からCOMインターフェイスを通してAsprovaのライブラリにアクセスします。

参照設定によりDim変数宣言の際にそのオブジェクトの型を使用することが出来たり、new 演算子でインスタンスを生成することが出来るようになります。

  1. Asprovaプロジェクトクラス
    Dim project As aslib.ASBProject
  2. 拡張プラグインDLLで使うプラグインキーに関連のあるオブジェクトのリスト
    Dim ArgList As ASPArgList
  3. 品目クラス
    Dim item As ASBItem

プラグインからAsprovaのライブラリを参照する場合、下記の2つのAsprovaのクラスライブラリを開発環境の参照設定から登録します。

  1. As 1.1 Type Library
  2. AsPlugInManager 1.0 Type Library

プラグインのプロジェクトファイルの構成

COMポート2
プラグインの場合、Asprovaから呼び出す関数をASDefaultクラスのAutoRegistrationメソッドに登録します。Asprovaの「プラグイン情報」にプラグインとして登録しておけばAsprova起動時にAutoRegistration関数が自動的に呼ばれ、プロジェクトオブジェクト内に実装されます。

Standard EXE(オートメーションクライアント)の場合はASDefaultクラスは必要ありません(「DLLまたはEXEからのAsprovaオブジェクト取得方法」)。

Asprovaのプラグインマネージャー(プラグイン登録関数)のAddASPlugInメソッドに4つの引数を渡すことによりプラグインを登録しますが、その内容は「自分はFactoryというプロジェクトで、OvertimeというクラスにAddOverTimeというメソッド(エントリ関数)を用意しているから、プラグインキーKeyHookGenericのタイミングで呼んでください」というものです。

プラグインキー(アクセスポイント)に対応するフックと関数のマッピング

Asprovaはあるイベントごとにプラグインを実行させるためのフックを設けています。この各イベントを表すアクセスポイントをプラグインキーと呼び、例えばKeyHookGenericは「コマンドの追加」、つまり追加したコマンドが起動するタイミングのアクセスポイントで、コマンドを実行することによりプラグインを実行させます。

Asprovaは起動時にプラグインを自動的に読み込むと、内部コマンドのプラグインに「エントリ関数の表示名」(プラグインマネージャ呼び出し時の第一引数)を表示させます。

プラグインの中からAsprovaのプラグインマネージャーを呼び出し4つの引数を渡すことによりプラグインを登録します。
COMポート3

COMポート(communication port)のポートと同じ考え方

ついでに言うとCOMポートとCOMインターフェイスのCOMは別物ですが、外部インターフェイスとの標準規格という意味ではCOMポートもCOMインターフェイスも同じもです。

ソフトウェアやハードウェアには、外部とデータを入出力するためにデータの受け渡しの方法を標準化したインターフェース(ポート)を持っています。例えばPOPとSMTPサーバーのポート、DBに接続するときのポートはいずれもTCP/IPのポートです。

標準的なパソコンは、キーボードなどの周辺機器を接続するためのインターフェースとしてPS/2ポートやUSBポート、LANポート(Ethernetポート)などを備えています。

ソフトウェアの場合、外部の装置や通信ネットワークとのデータの送受信を標準的な方法で統一的に扱う方法がOSなどによって提供されており、通信相手などを識別するのにポートが使われます。

Windowsではモデムやプリンタ、イメージスキャナなどにアプリケーションソフトが統一的な方法でアクセスできるよう、入出力方式を統一した「COMポート」という仕組みが提供されており、アプリケーションソフトは自分の対象とする機器がどのCOMポートに接続されているかを知るだけで、当該機器との入出力が取り扱えるようになります。

例えばUSBバーコードを接続する場合にはCOM13が割り当てられますが、物理的にPCには13個もインターフェイスは存在しないのでCOM13というポートはあくまで仮想的なものです。

TCP/IPを利用したネットワーク通信では、通信機器や個々のコンピュータの持つIPアドレスの下に設けられた補助アドレスとして、0から65535までの「ポート番号」が使われます。

これにより、1台のコンピュータで複数のサービスを提供したり、複数のコンピュータと同時に通信できるようになっています。単に「ポート」といった場合には、このTCP/IPのポート番号を指すことも多いです。