JRA-VAN Datalab JV-Link を Visual Studio2019 C#で使用する

 

 

https://jra-van.jp/dlb/sdv/index.html

JRA-VAN からデータを取得するプログラムを作成しようとして、JV-Linkを初期化するまでに、結構ハマったので、手順をメモ。

1.Windows Forms C#プロジェクトを作成

01 project

2.JVLink Classの参照追加

2.1 ツールボックスアイテムの選択

02 add toolbox

2.2 JVLink Classにチェックを入れてOK

03 add toolbox dialog

手順書通りなら、これで、ツールボックスにJVLink のアイコンが表示され、フォームに配置することで、動かせるはず(VB.NETの場合)なのだが、C#では、ツールボックスにJVLinkのアイコン表示されず(全て表示にすると、利用不可状態で淡色表示されるが、フォームデザイナにドロップできない状態)なので、SDK付属のVBのサンプルを以下の手順で、動作確認する。
結果、C#プロジェクトにも同様の対応をする

 

3.VB2005用のサンプルをVB2019で動かす

ターゲットフレームワークがインストールされていないというエラーが出るため、、

04 err target

ツールと機能を取得から、個別のコンポーネントを選択し、

 
05 insetall target fw

.NET Framework 4.6.1 Targeting Pack をインストール

06 install target fw dialog

さらに、構成プロパティから、プラットフォームを、x86に変更する

07 targetplatform

これで、添付のサンプルは動くようになった。

4.ライブラリの参照追加

JVLinkのライブラリは、どうやら、VB6で作成されたものっぽい。正しくビルドされると、.NET用のラッパーのライブラリが生成されるようなのだが、今回画面にJVLinkオブジェエクトを配置できなく、ビルドができないので、おそらくビルドすると生成されるであろう、以下の2ライブラリが生成されない。

SDKに添付されているVB2005のサンプル中に返還後のライブラリが含まれるため、今回のC#版でも、そのライブラリを参照する。

また、ローカルにコピーを「はい」にしておく。

  • AxInterop.JVDTLabLib
  • Interop.JVDTLabLib

08 assembly

5.テストコードの実装

動作確認用にボタンを一つ画面に落とす。

09 form design

 

フォームのコードに、SDKのVBサンプルのコードを参照して、JVLinkコントロールの内容を移植する。

本来、画面にコントロールを貼り付ける形だと、InitializeComponentの中に、IDEが自動生成するのだろうが、そこに書くと消えてしまうので、呼び出し前に同じように記述する。this.Contorols.Addの行がないと、OCXコントロールの準備が整わないうちに、Form Loadedになってしまうようで以下のエラーが発生、しばらくはまった。

 

例外がスローされました: 'System.Windows.Forms.AxHost.InvalidActiveXStateException' (AxInterop.JVDTLabLib.dll の中)
現時点ではメソッド 'JVInit' を呼び出せません。

 

using System;
using System.Diagnostics;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using AxJVDTLabLib;

namespace JRA_VAN_PROTO
{
    public partial class Form1 : Form
    {
        private AxJVLink jVLink = new AxJVDTLabLib.AxJVLink();
        private System.Resources.ResourceManager resources;

        public Form1()
        {
            resources = new System.Resources.ResourceManager(this.GetType());
            jVLink.Location = new System.Drawing.Point(0, 0);
            jVLink.Name = "jVLink";
            jVLink.OcxState = (System.Windows.Forms.AxHost.State)resources.GetObject($"{jVLink.Name}.OcxState");
            jVLink.Size = new System.Drawing.Size(10, 10);
            this.Controls.Add(jVLink);

            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            jVLink.JVSetUIProperties();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                var ret = jVLink.JVInit("UNKNOWN");
                Debug.WriteLine($"RET={ret}");
            } 
            catch (Exception exception)
            {
                Debug.WriteLine(exception);
            }
        }
    }
}

 

6.実行

ロードと初期化、ダイアログの表示ができた。めでたし。

10 run jvlink

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です