JRA公式競馬データ配信サービス JRA-VAN Data Lab.

JRA-VAN DataLab.

競馬ソフト開発コーナー

プログラミング質問広場

本掲示板は、プログラミングに関する情報を作者様同士で共有・議論していただく場として用意いたしました。
JV-Link、JV-Dataに直接関連しない(一般論としてのプログラミング方法やAPI・メソッドの利用法などの)スレッドはこちらに立ててください。

一括表示 リストに戻る
タイトルC#からのMVReadの利用
記事No4888
投稿日: 2022/06/01(Wed) 09:14
投稿者KMY
お世話になります。

C#(.NET6)で競馬アプリを開発しています。
調教動画を取得したく、MVOpenとMVReadを試していますが、なかなかうまくい
きません。

JVReadと異なり参照渡しする変数の型がstringになっているため、同じ方法で
呼び出すことはできません。
unsafeなど試しましたが、いずれも同じエラーが返ってきます。
どのようにすればよいのか、ご教授いただけますでしょうか。よろしくお願い
します。


【ソース】
-------------------------------------------------
var openResult = this.link.MVOpen(((short)type).ToString(), key);
if (openResult != 0)
{
throw new JVLinkException<JVLinkMovieResult>((JVLinkMovieResult
)result);
}

var size = 19;
var list = new List<string>();

int result;
var buff = new string(Enumerable.Repeat(' ', size + 1).ToArra
y());

while ((result = this.link.MVRead(out buff, out size)) != 0)
{
if (result > 0)
{
list.Add(buff.ToString());
}
else
{
throw new JVLinkException<JVLinkMovieResult>((JVLinkMovieResu
lt)result);
}
}


// 別ファイル内
public int MVOpen(string type, string key) => this.link.JVMVOpen(typ
e, key);
public int MVRead(out string buff, out int size) => this.link.JVMVRe
ad(out buff, out size);
-------------------------------------------------

【結果】
サーバーによって例外が返されました。 (0x80010105 (RPC_E_SERVERFAULT))

タイトルRe: C#からのMVReadの利用
記事No4889
投稿日: 2022/06/01(Wed) 21:31
投稿者Tachyon
提示されたソースで試しに検証してみましたが、問題なく動作します。
エラーとなった具体的な箇所はどこなのでしょうか? 別ファイル内?

ちなみに、フォームにボタンを配置し以下のソースで検証しました。

【ソース】
-------------------------------------------------
private JVLinkClass cJVLink = new JVLinkClass();

private void button1_Click(object sender, EventArgs e)
{
try
{
int initResult = cJVLink.JVInit("SA000000/SD000004");
if (initResult != 0)
{
MessageBox.Show("JVInit (" + initResult.ToString(
) + ")", "Error", MessageBoxButtons.OK, MessageBoxIc
on.Error);
return;
}

// テストデータ:2022/05/29開催の全出走馬を対象
var type = 11;
var key = "20220529";

var openResult = MVOpen(((short)type).ToString(), key);
if (openResult != 0)
{
//throw new JVLinkException<JVLinkMovieResult>((JVLin
kMovieResult)result);
MessageBox.Show("JVMVOpen (" + openResult.ToStrin
g() + ")", "Error", MessageBoxButtons.OK, MessageBox
Icon.Error);
return;
}

var size = 19;
var list = new List<string>();

int result;
var buff = new string(Enumerable.Repeat(' ', size + 1
).ToArray());

while ((result = MVRead(out buff, out size)) != 0)
{
if (result > 0)
{
list.Add(buff.ToString());
}
else
{
//throw new JVLinkException<JVLinkMovieResult>((J
VLinkMovieResult)result);
MessageBox.Show("JVMVRead (" + result.ToStrin
g() + ")", "Error", MessageBoxButtons.OK, MessageBox
Icon.Error);
break;
}
}
if (result == 0)
{
MessageBox.Show("JVMVRead (" + list.Count.ToStrin
g() + ")", "End", MessageBoxButtons.OK, MessageBoxIc
on.Information);
}
}
finally
{
cJVLink.JVClose();
}
}

private int MVOpen(string type, string key) => cJVLink.JVMVOpen(type
, key);
private int MVRead(out string buff, out int size) => cJVLink.JVMVRea
d(out buff, out size);

タイトルRe^2: C#からのMVReadの利用
記事No4890
投稿日: 2022/06/01(Wed) 21:57
投稿者KMY
Tachyon様、ご検証くださりありがとうございます。
私も明日もう一度試してみますが、以下教えていただけますでしょうか。

・検証に利用したフレームワーク(.NET 6、.NET 5、.NET Core 3.0、.NET Fra
mework 4.8など)


> エラーとなった具体的な箇所はどこなのでしょうか? 別ファイル内?

私が掲示したコードのうち、while句の行になります。

while ((result = this.link.MVRead(out buff, out size)) != 0)

タイトルRe^3: C#からのMVReadの利用
記事No4891
投稿日: 2022/06/01(Wed) 22:14
投稿者KMY
すみません、今調べてみたらSTAスレッド以外で実行したのが原因でした。
解決しました。お騒がせしました。

タイトルRe^4: C#からのMVReadの利用
記事No4894
投稿日: 2022/06/01(Wed) 23:14
投稿者Tachyon
解決して何よりです。
見覚えがあるエラーはSTAスレッド要因だったんですね。
もう必要ないでしょうが、検証フレームワークは「.Net6」です。

ウィンドウを閉じる