ネイティブDLL関数の呼び出し

Epson RC+ 8.0では、ネイティブDLL関数を呼び出すことができます。

複雑な演算処理や周辺機器用のネイティブ関数を呼び出すときなどに使用します。

ネイティブDLL関数呼び出しを行うためには、SPEL+プログラムにて関数定義命令であるDeclare文を記述し、通常の関数呼び出しを記述します。

詳細は、以下のマニュアルを参照してください。

"SPEL+ランゲージリファレンス - Declare"

ネイティブDLL呼び出しサンプル

Microsoft Visual Studio 2019 などの開発ツールを使用して、SPEL+から呼び出し可能なネイティブDLLを作成することができます。ここではサンプルとして、Visual Studio 2019を使用して四則演算を行うファンクションを作成します。

Step 1: ネイティブDLLで使用する変数型の決定

ネイティブDLLとEpson RC+ 8.0で受け渡しをするデータ型を決めます。Epson RC+ 8.0のデータ型とC/C++の変数型は、下表のように対応しています。Epson RC+ 8.0に対応するデータがないため、C/C++のbyte型や構造体は使用することができません。

Epson RC+ 8.0とC/C++ データ型対応表

Epson RC+ 8.0 C/C++
Boolean short
Byte short
Short short
Integer short
Long int
Real float
Double double
String char [256] * Nullを含む

Step 2: ネイティブDLLの作成

  1. Visual Studio 2019を起動します。

    スタートウィンドウで"新しいプロジェクトの作成"を選択します。

  2. [新しいプロジェクトの作成]ダイアログが表示されます。

    1. ダイアログの右側に表示されているプロジェクトテンプレートの一覧から"Windowsデスクトップウィザード"を選択します。

    2. [次へ]ボタンをクリックします。

  3. Windowsデスクトップウィザードが起動します。

    1. [プロジェクト名(N)]で、プロジェクト名を入力します。 (ここでは、"MyCalculator"と入力します。)

    2. [作成]ボタンをクリックします。

  4. プロジェクトのオプションを指定します。

    1. [アプリケーションの種類(T)]で、"ダイナミック リンク ライブラリ(.dll)"を選択します。

    2. [追加のオプション:]で、[シンボルのエクスポート(X)]ボックスをチェックします。

    3. [OK]ボタンをクリックします。

  5. MyCalculator.cppに簡単な関数の例 "fnMyCalculator"が自動作成されます。このファイルに四則演算を行うMyArithmetic関数を追加します。

    MYCALCULATOR_API float MyArithmetic(short value1, short value2, char * kind )
    {
      if ( !strcmp(kind, "add") )
      {
        return (float)(value1 + value2);
      }
      else if ( !strcmp(kind, "sub") )
      {
        return (float)(value1 - value2);
      }
      else if ( !strcmp(kind, "mul") )
      {
        return (float)(value1 * value2);
      }
      else if ( !strcmp(kind, "div") )
      {
        return (float)(value1) / (float)(value2);
      }
      else
      {
        strcat_s(kind, 10, " NG");
        return 0;
      }
    }
    
  6. SPEL+から呼び出せるように関数をエクスポートします。

    1. Visual Studio 2019 メニュー - [プロジェクト] - [新しい項目の追加]を選択します。[新しい項目の追加]ダイアログが表示されます。

    2. ダイアログの左側のツリーから[Visual C++] - [コード]を選択します。

    3. ダイアログの中央に表示されるテンプレートの一覧から"モジュール定義ファイル(.def)"を選択します。

    4. [名前(N):]に、ファイル名を入力します。(ここではファイル名に "MyCalculator.def"を設定します。)

    5. [追加(A)]ボタンをクリックします。

    6. 作成された"MyCalculator.def"ファイルに、"fnMyCalculator関数" と "MyArithmetic関数"を登録します。

      LIBRARY "MyCalculator"
      EXPORTS
      fnMyCalculator
      MyArithmetic
      
  7. プロジェクトをビルドし、DLLを作成します。Visual Studio 2019のソリューションプラットフォームとして[Win32]を選択します。さらに、Visual Studio 2019メニュー - [ビルド] - [MyCalculatorのビルド]を選択します。エラーが表示されなければ、DLLは、作成されています。

キーポイント


Epson RC+ 8.0では、64bit版のネイティブDLLは利用できません。また、Visual Studio 2015より前のバージョンで作成されたDLLを利用する場合、別途、そのバージョンに対応したランタイムをあらかじめインストールしておく必要があります。

Step 3: SPEL+からのDLLファンクションの呼び出し

キーポイント


Epson RC+ 8.0から作成した関数を呼び出す前に、関数が正しく動作することをデバッグして十分に確認してください。ネイティブ関数内でシステムエラーなどが発生した場合は、Epson RC+ 8.0は正常に動作しません。

  1. Epson RC+ 8.0のプロジェクトフォルダー (例:C:\EpsonRC80\projects\dllcall)に、作成したMyCalculator.dllをコピーします。

  2. SPEL+プログラムに、ネイティブDLLの四則演算関数を定義し、Function main に四則演算関数MyArithmeticの呼び出しを記述します。

    Declare MyArithmetic, "MyCalculator.dll"(value1 As Integer, value2 As Integer, ByRef calc$ As String) As Real
    Function main
      Real result;
      String calc$
    
      calc$ = "add"
      result = MyArithmetic(1, 2, ByRef calc$);
      Print "1+2=", Str$(result)
      calc$ = "sub"
      result = MyArithmetic(1, 2, ByRef calc$);
      Print "1-2=", Str$(result)
      calc$ = "mul"
      result = MyArithmetic(1, 2, ByRef calc$);
      Print "1*2=", Str$(result)
      calc$ = "div"
      result = MyArithmetic(1, 2, ByRef calc$);
      Print "1/2=", Str$(result)
    Fend
    
  3. プロジェクトをビルドし、実行します。以下の結果が表示されます。

    1+2=3
    1-2=-1
    1*2=2
    1/2=0.5
    

キーポイント


プロジェクトをビルドする前に、必ずネイティブDLLをプロジェクトフォルダーへコピーしてください。コピーせずにビルド, 実行した場合は、警告やエラーが発生します。

また、ネイティブDLLとして、サードパーティー製DLLを利用する場合は、そのDLLの依存関係に注意してください。依存するDLLがプロジェクトフォルダー、またはWindowsの環境変数PATHに設定されているフォルダーに存在しない場合は、警告やエラーが発生します。