COM接続時の認証エラーについて

Python (32bit) を使用してJV-LinkのCOMコンポーネントに接続しようとしていますが、COMオブジェクトの生成は成功するものの、JVInit() 呼び出し時に認証に関するエラーコードが返され、接続が完了しません。

利用キーが有効であること、および管理者権限で実行してもエラーが解消されないことから、システムまたはCOMサービス側の権限設定に問題があると考えています。

発生している問題の詳細
最終的なエラーコード: -103 (利用キーが設定されていない/空値)

環境: Windows 10/11 (64bit OS上で 32bit版のPython仮想環境を使用)

COMコンポーネント: JVDTLab.JVLink (CLSIDのデータに接続)

●確認済み事項(成功/正常な状態)

・COMオブジェクトの生成: win32com.client.Dispatch() によるJV-Link COMオブジェクトの生成は成功しています。

・利用キーの有効性:

JV-Linkソフトの設定画面で、キーが「正常」状態であることを確認済み。

JRA-VAN Webサイト上でもキーは「利用中」であることを確認済み。

排他利用の解除: 他のJV-Link利用アプリケーションをすべて終了した状態でテストを実行しています。

実行環境の権限: Pythonプログラムを**「管理者として実行したコマンドプロンプト」**から実行しています。

● 解決したい事象

以下の形式で JVInit() を呼び出しても、戻り値は一貫して -103 となり、認証に失敗します。

jv_lab.JVInit(利用キー)

jv_lab.JVInit() (引数なし、レジストリ参照を期待)

michihiro_Kawaguchiさん、おはようございます。

Python使っている時点でなかなか公式の方の回答は得られないかと思います。理由はサポート対象外だから。

JVInitの戻り値の説明はみましたか?「sidが不正(sidの1桁目がスペース)」と書かれてます。仮にjv_lab.JVInitがPythonでのJVInitを模したものだとして、そもそもJVInit()自体がJV-Linkの仕様そのものだと仮定すると

Long JVInit ( String 型 sid);

でsidはJV-Linkインターフェース仕様書に書かれている様に指定する必要があり、利用キーとか引数なしはあり得ません。どちらも当然のことですが「sidが不正」ですね。特にsid取得していない場合は「デフォルトで "UNKNOWN"が使用可能です。」と書かれていますよ。

追記
sidの説明がインターフェース仕様書で説明不十分な気もします。「ソフトウェア ID はJRA-VAN に登録済みのものである必要があります。」とは書かれてますが、実際にこれ何?って思われるかもしれませんが、これってJRA-VANでソフト作者登録済ませていない場合はsidの取得は出来ません。なので、取敢えず作ってみようかなってユーザーさんは”UNKNOWN”一択になります。

こんなんで動いてます

import win32com.client as wc, time
jv = wc.Dispatch(“JVDTLab.JVLink”); assert jv.JVInit(“UNKNOWN”)==0
try:
try: jv.JVClose()
except: pass

rc, readcnt, dldcnt, lts = jv.JVOpen("RACE", "00000000000000", 2, 0, 0, "")
print(f"[OPEN] rc={rc} read={readcnt} dld={dldcnt} lts='{lts}'")
if rc != 0: raise SystemExit(rc)

BUF = " " * 1_048_576
lines = 0; neg3 = 0
while True:
    n, BUF, _, _ = jv.JVRead(BUF, len(BUF), "")
    if n > 0:
        print(BUF[:n], end="")
        lines += 1; neg3 = 0
        continue
    if n == 0:
        print(f"[EOF] lines={lines}")
        break
    if n == -3:
        neg3 += 1
        if neg3 % 20 == 0: print(f"[wait] -3…({neg3})")
        time.sleep(0.2)
        continue
    print(f"[ERROR] n={n}")
    break

finally:
try: jv.JVClose()
except: pass

ありがとうございます。接続できました