C#からのMVReadの利用

タイトル C#からのMVReadの利用
記事No 4888
投稿日 : 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
)result);
}

var size = 19;
var list = new List();

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((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の利用
記事No 4889
投稿日 : 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((JVLin
kMovieResult)result);
MessageBox.Show(“JVMVOpen (” + openResult.ToStrin
g() + “)”, “Error”, MessageBoxButtons.OK, MessageBox
Icon.Error);
return;
}

var size = 19;
var list = new List();

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((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の利用
記事No 4890
投稿日 : 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の利用
記事No 4891
投稿日 : 2022/06/01(Wed) 22:14
投稿者 KMY

すみません、今調べてみたらSTAスレッド以外で実行したのが原因でした。
解決しました。お騒がせしました。|

タイトル Re^4: C#からのMVReadの利用
記事No 4894
投稿日 : 2022/06/01(Wed) 23:14
投稿者 Tachyon

解決して何よりです。
見覚えがあるエラーはSTAスレッド要因だったんですね。
もう必要ないでしょうが、検証フレームワークは「.Net6」です。|