0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Python(64bit)でJV-Link.JVGets()を使いたい

Last updated at Posted at 2025-06-25

以前の記事で、そこそこ需要がありそうなので第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とか使って試行錯誤したのですが、うまくいきません。
結論としては、意外と単純でした。

hrap_jvlink.py
    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 で公開したので、興味があれば使ってみてください。
まぁ、まったく責任は取れませんが・・・

良かったら「いいね」お願いします。励みになります!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?