![見出し画像](https://assets.st-note.com/production/uploads/images/104474058/rectangle_large_type_2_96de4a57144761ae9661460b617ffcb9.png?width=800)
【競馬】Visual C++ で JRA-VAN DataLab. のデータを取得する
Visual C++ で JV-Link を操作することにより、JRA-VAN DataLab. が提供する競馬データを取得することができます。
今回は Visual C++ を使って簡単な競馬ソフトを作りたいと思います。
1. 動作環境
OS : Windows
どこまで古いバージョンで動作するかは分からないですが、Windows 10 以降であれば問題ないはずです。
私の使っている環境は
Windows 11 Home (64bit 版)
です。
2. JV-Link のインストール
こちらのページの [動作確認 (JV-Link)] のタブからインストーラーをダウンロードしてインストールおよび初期設定を行って下さい。
※ 使用するには JRA-VAN DataLab. の会員登録が必要です。
3. Visual Studio 2019 のインストール
Visual Studio Installer を使って Visual Studio Community 2019 をインストールします。
ワークロードには [デスクトップとモバイル] > [C++ によるデスクトップ開発] を選択し、オプション内の [v142 ビルドツール用 C++/CLI サポート (最新)] にチェックを入れます。
※ Visual Studio 2019 を使用して下さい。Visual Studio 2020 は IDE 自体が 64bit 化されたためか、この記事の手順ではうまくいきません。
![](https://assets.st-note.com/img/1682960005140-0xSubGK5ko.png?width=800)
![](https://assets.st-note.com/img/1682960011544-UhRlvnxMhP.png?width=800)
4. 新規プロジェクトの作成
Visual Studio 2019 を起動し、[新しいプロジェクトの作成] をクリックします。
![](https://assets.st-note.com/img/1682960018055-Yh2taKOY7O.png?width=800)
プロジェクト テンプレートから C++ 用の [CLR 空のプロジェクト (.NET Framework)] を選択し、[次へ] ボタンをクリックします。
※ [CLR 空のプロジェクト (.NET)] の方ではないので注意して下さい。
![](https://assets.st-note.com/img/1682960131832-XglbGBgVUs.png?width=800)
プロジェクト名、場所、ソリューション名を設定し、[作成] ボタンをクリックします。
プロジェクト名、ソリューション名はデフォルトの [Project1] としています。
![](https://assets.st-note.com/img/1682960447478-gDnE06dhbU.png?width=800)
新規のプロジェクトが作成されました。
![](https://assets.st-note.com/img/1682965912252-Y0PaAqgEha.png?width=800)
[プロジェクト] > [新しい項目の追加] をクリックします。
![](https://assets.st-note.com/img/1682963193088-djCrqOvbkl.png?width=800)
新しい項目の追加画面が開きます。
![](https://assets.st-note.com/img/1682963219597-weJoIoZSHS.png?width=800)
[Visual C++] > [UI] > [Windows フォーム] を選択し、[追加] ボタンをクリックします。
名前はデフォルトの [MyForm.h] としています。
![](https://assets.st-note.com/img/1682963242097-K74dO5kn5L.png?width=800)
エラーが発生します。
![](https://assets.st-note.com/img/1682965859817-sY9xJnmgO6.png?width=800)
[ファイル] > [ソリューションを閉じる] をクリックします。
![](https://assets.st-note.com/img/1682963618650-B335NzTXTl.png)
実行する操作を選択する画面が開いたら、直近で開いていたプロジェクトの名前をクリックします。
![](https://assets.st-note.com/img/1682963628733-DjfcjLOOmY.png?width=800)
フォームが正常に表示されます。
![](https://assets.st-note.com/img/1682965798872-DKY3QUS7zk.png?width=800)
[表示] > [ツールボックス] をクリックします。
![](https://assets.st-note.com/img/1682963759393-Aj1WNmJYPp.png)
ツールボックス パネルが表示されます。
![](https://assets.st-note.com/img/1682963786813-IH6bDiAJuA.png)
5. JVLink Class の表示(初回のみ)
ツールボックス内の [全般] を右クリックし、[アイテムの選択] をクリックします。
![](https://assets.st-note.com/img/1682963836692-uJlKnfgWKg.png)
ツールボックス アイテムの選択画面が開きます。
![](https://assets.st-note.com/img/1682963968469-9pIgbd0Ke6.png?width=800)
[COM コンポーネント] タブを開き、[JVLink Class] にチェックを入れ、[OK] ボタンをクリックします。
![](https://assets.st-note.com/img/1682963983971-wnk1DVSrIZ.png?width=800)
ツールボックス内に [JVLink Class] が表示されれば OK です。
![](https://assets.st-note.com/img/1682964004810-NbAUsIBXeh.png)
※ JVLink Class の表示は一度行えば設定が保存されます。
6. プロジェクトの作成
ツールボックス内の [コモン コントロール] > [Button] をフォーム上に配置します。
![](https://assets.st-note.com/img/1682964033966-kD3Jru7dlB.png)
IDE 画面右下のプロパティの Name はデフォルトの [button1] としています。
![](https://assets.st-note.com/img/1682964062156-UuQBfbLNQj.png)
ツールボックス内の [全般] > [JVLink Class] をフォーム上に配置します。
※ JVLink Class は実行時に表示されないので、レイアウトを気にする必要はありません。
![](https://assets.st-note.com/img/1682964108006-ru36lvHqx5.png)
Name はデフォルトの [axJVLink1] としています。
![](https://assets.st-note.com/img/1682964129191-6IDMij825P.png)
デザインビューのフォームを選択し、プロパティをイベント タブに切り替え、[Load] の右側の空欄をダブルクリックします。
![](https://assets.st-note.com/img/1682965722811-jz3HYvH3Bb.png?width=800)
MyForm_Load 関数が追加された状態でコードエディタが開きます。
![](https://assets.st-note.com/img/1682964205026-Ql21P40yCN.png?width=800)
MyForm_Load 関数の中身を下記コードで上書きします。
private: System::Void MyForm_Load(System::Object^ sender, System::EventArgs^ e) {
int returnCode;
String^ sid = "UNKNOWN";
// JVLink初期化
returnCode = axJVLink1->JVInit(sid);
// JVInitエラー処理
if (returnCode != 0) {
MessageBox::Show("JVInitエラー:" + returnCode.ToString());
return;
}
}
デザインビューのフォーム上の button1 をダブルクリックします。
![](https://assets.st-note.com/img/1682964504136-d0pIccBORT.png)
button1_Click 関数が追加されます。
![](https://assets.st-note.com/img/1682964534484-DTwRZTtepq.png?width=800)
button1_Click 関数の中身を下記コードで上書きします。
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
int returnCode;
int buffSize = 40000;
String^ buff;
String^ fileName;
String^ raceName;
String^ raceNames = "";
int len;
String^ lastChar;
// 速報系データの0B12を呼び出し
// 日付は直近の土日を指定して下さい
returnCode = axJVLink1->JVRTOpen("0B12", "20230430");
// JVRTOpenエラー処理
if (returnCode != 0) {
MessageBox::Show("JVRTOpenエラー:" + returnCode.ToString());
return;
}
returnCode = 1;
while (returnCode != 0) {
returnCode = axJVLink1->JVRead(buff, buffSize, fileName);
// JVReadエラー処理
if (returnCode < -1) {
MessageBox::Show("JVReadエラー:" + returnCode.ToString());
break;
}
else if (returnCode == -1) {
continue;
}
else if (returnCode == 0) {
break;
}
if (buff->Substring(0, 2) == "RA") {
// レース名を抽出
raceName = buff->Substring(32, 30);
len = raceName->Length;
lastChar = raceName->Substring(len - 1, 1);
// 末尾の全角スペースを除去
while ((len > 0) && (lastChar == " ")) {
raceName = raceName->Substring(0, len - 1);
len = raceName->Length;
if (len > 0) {
lastChar = raceName->Substring(len - 1, 1);
}
}
// レース名が空文字でなければレース名一覧に結合
if (raceName != "") {
raceNames += raceName + "\r\n";
}
}
}
// レース名一覧を表示
MessageBox::Show(raceNames);
// JVLink 終了処理
returnCode = axJVLink1->JVClose();
}
13 行目の
returnCode = axJVLink1->JVRTOpen("0B12", "20230430");
の日付部分は直近の土日(中央競馬のレースが開催された日)を yyyymmdd 形式で指定して下さい。
※ このコードで取得している速報系データはレース後 1 週間程で配信されなくなるので、古い開催日を指定してもデータは取得できません。
[プロジェクト] > [新しい項目の追加] をクリックします。
![](https://assets.st-note.com/img/1682964744981-ZwLfk3o62F.png?width=800)
新しい項目の追加画面が開いたら、[Visual C++] > [コード] > [C++ ファイル (.cpp)] を選択し、[追加] ボタンをクリックします。
名前はデフォルトの [ソース.cpp] としています。
![](https://assets.st-note.com/img/1682964833611-UrIAAAyjGC.png?width=800)
コードエディタが開きます。
![](https://assets.st-note.com/img/1682964995294-Q476gdeGht.png?width=800)
ソース.cpp 内に下記コードを入力します。
#include "MyForm.h" // Form名.h
#include <string>
using namespace System;
using namespace System::Windows::Forms;
[STAThreadAttribute]
int main(array<String^>^ args) {
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);
// gcnew プロジェクト名::Form名()
Application::Run(gcnew Project1::MyForm());
return 0;
}
[プロジェクト] > [Project1 のプロパティ] をクリックします。
![](https://assets.st-note.com/img/1682965188228-7rrVmUK1cO.png?width=800)
Project1 プロパティ ページ画面が開きます。
![](https://assets.st-note.com/img/1682965223508-O49UOP7CFD.png?width=800)
[構成プロパティ] > [リンカー] > [システム] を選択し、[サブシステム] のプルダウンから [Windows (/SUBSYSTEM:WINDOWS)] を選択します。
![](https://assets.st-note.com/img/1682965259392-O0NQwJwzQw.png?width=800)
[構成プロパティ] > [リンカー] > [詳細設定] を選択し、[エントリポイント] の右の空欄に [main] と入力し、[OK] ボタンをクリックします。
![](https://assets.st-note.com/img/1682965391449-NPOkLsf4Nj.png?width=800)
[ローカル Windows デバッガー] ボタンをクリックします。
![](https://assets.st-note.com/img/1682965503276-OXQnB9mzSu.png?width=800)
例外が発生します。
![](https://assets.st-note.com/img/1682966182976-s4pFSeurJG.png?width=800)
[デバッグの停止] ボタンをクリックします。
![](https://assets.st-note.com/img/1682966198376-fM0VQrVJZ4.png?width=800)
エクスプローラーで [プロジェクト フォルダ]\Project1\Interop フォルダを開き、AxInterop.JVDTLabLib.1.18.dll ファイルをコピーします。
![](https://assets.st-note.com/img/1682966360219-IEGmVQ6Vma.png?width=800)
[プロジェクト フォルダ]\Debug フォルダ内に AxInterop.JVDTLabLib.1.18.dll ファイルを貼り付けます。
![](https://assets.st-note.com/img/1682966368654-fWBT6ULXJB.png?width=800)
7. 動作確認
[ローカル Windows デバッガー] ボタンをクリックします。
![](https://assets.st-note.com/img/1682966426516-zLfN9fEcUp.png?width=800)
MyForm が表示されたら、button1 をクリックします。
![](https://assets.st-note.com/img/1682966435820-N2qrV4D1GF.png)
メッセージボックスにレース名が表示されれば OK です。
![](https://assets.st-note.com/img/1682966462127-EHjisnRJH8.png)
レース開催が無い日や、古い開催日をコード内で指定している場合は下図のようなエラーが発生します。
![](https://assets.st-note.com/img/1682966473695-dYDXd42qFK.png)
※ Release 構成にして [ローカル Windows デバッガー] ボタンをクリックした場合も初回実行時は例外が発生するので、[プロジェクト フォルダ]\Release フォルダ内に AxInterop.JVDTLabLib.1.18.dll ファイルを配置して下さい。
この記事が気に入ったらサポートをしてみませんか?