以前の記事で、そこそこ需要がありそうなので第2弾です。
前提として Python で JVRead は出来てるけど、JVGetsが動かない!という人向けです。
2025-07-14
ダミーパラメーターを空文字列("")からbytearray()へ変更
→たまにJVLinkAgent.exeが落ちてしまう原因っぽい
今までPythonからJVGets()を使う方法がわからなくて、JVRead()を使ってました。
ですが、何とかJVGets()も動くようになったので、その方法の紹介になります。
JV-Linkにはデータ読込み手段としてJVReadとJVGetsという2つのメソッドがあります。
JVRead は読み込んだデータを文字列(UNICODE)として返してくれます。
わかりやすいですね。
しかし、データは固定長フォーマットであり、「JV-Data仕様書」ではShift-JISを前提としたバイト数で記述されているので、処理する際にはShift-JISバイト配列へ変換してから分割する必要がありました。
一方、JVGets はShift-JISのバイト配列を返してくれます。
元々、ダウンロードするデータがShift-JISらしく、それをそのまま返すので効率が良いという触れ込みです。
詳細は「JV-Linkインターフェース仕様書」を参照してください。
JVGets()
「JV-Linkインターフェース仕様書」抜粋
【構文】
Long JVGets( Byte Array 型buff , Long 型size , String 型filename );
【パラメータ】
buff
データが格納されたBYTE型配列がセットされるポインタを指定します。
size
コピーするデータの長さを指定します。この値がレコード長よりも小さい場合には残りのデータは切り捨てられ、データ格納バッファの最後の1バイトがストリング終端文字NULL となります。
filename
現在読み込み中のファイル名がJVGets から返されます。
ポインタって、どうやって指定すればいいの?
最初は、ctypesとか使って試行錯誤したのですが、うまくいきません。
結論としては、意外と単純でした。
def gets(self, size: int = 103000) -> tuple[int, bytes, int, str]:
"""
JVGets
参考情報)戻り値の読込みデータはShift-JISのバイト配列です。
Args:
size (int, optional): バッファサイズ. Defaults to 103000.
Returns:
(int, bytes, int, str): リターンコード, 読込みデータ, バッファサイズ, ファイル名
"""
#byte_array = bytearray(1)
#result = self._jv_link.JVGets(byte_array, size, "")
dummy_arg1 = bytearray()
dummy_arg2 = bytearray()
result = self._jv_link.JVGets(dummy_arg1, size, dummy_arg2)
self.logger.debug("JVGets(addr, %d, ''): result=%s", size, result)
memview: memoryview
(return_code, memview, file_name) = result
return (return_code, memview.tobytes(), size, file_name)
上記は、自作JV-Linkラッパークラスの抜粋です。
第一引数:buffは単純にバイト配列を指定すれば良いようです。
この配列は結局使われないので、1バイトで問題ありません。
第三引数:filenameもダミーで 空文字列 "" で問題ありません。
ダミーパラメーターは空文字列だと問題ありそうなのでbytearray()へ修正しました。(JVReadも同様)
たまにJVLinkAgent(サービス)が落ちることがあったのですが、それの原因じゃないかと考えてます。
そうすると3つの値が返ってきます。
(return_code, memview, file_name)
この2番目の値がmemoryviewのインスタンスでした。
なのでmemview.tobytes()
でバイト配列(bytes)を取得できました。
仕様書の通り、中身はShift-JISコードの配列になってます。
これは、そのまま分割処理に渡せますね。
この JV-Linkラッパークラス は note で公開したので、興味があれば使ってみてください。
まぁ、まったく責任は取れませんが・・・
良かったら「いいね」お願いします。励みになります!