質問

ねえ!あなたは気づいたかもしれないと私はctypesので迷惑な問題があります。私は、機器と通信するために、私はDLLドライバと通信するためにctypesを使用する必要があり、そうしようとしています。

これまでのところ、私はこれを行うことにより、DLLをエクスポートすることができた。

>>> from ctypes import *
>>>maury = WinDLL( 'MLibTuners')
>>> maury
(WinDLL 'MlibTuners', handle 10000000 at 9ef9d0)
>>> maury.get_tuner_driver_version()
(_FuncPtr object at 0x009F6738)
>>> version_string = create_string_buffer(80)
>>> maury.get_tuner_driver_version(version_string)
2258920
>>> print version_string.value
'Maury Microwave MT993V04 Tuner Driver DLL, Version 1.60.00, 07/25/2007'

そして、それはパラメータとして与えられた80バイトの文字列にチューナードライバのDLLを保存することになっているドキュメントによると、かなりうまく動作します。 しかし、私はそれが失敗し、のadd_tuner の呼び出された関数を使用しようとします。これは、ドキュメントが言うことです。

short add_tuner(short tuner_number, char model[], short serial_number,
               short ctlr_num, short ctlr_port, short *no_of_motors, long max_range[],
               double *fmin, double *fmax, double *fcrossover, char error_string[])

これは、私は上記の関数を呼び出すことを試みた方法です。 私は得続ける理由を変更したパラメータは以下の値があまりにも正しいマニュアルに従って、すべてのポインタであり、[] MAX_RANGE、私はちょうど、のWindowsのアクセス違反の書き込み0x00000000の

no_motors = pointer(c_short())
f_min = pointer(c_double())
f_max = pointer(c_double())
f_crossover = pointer(c_double())
maury.add_tuner(c_short(0), c_char_p('MT982EU'), c_short(serial_number), c_short(0),
                                c_short(1),no_motors, c_long(),
f_min,f_max,f_crossover, create_string_buffer(80))

シリアル番号しかしながら変数を参照のうえによって検閲与えられます。誰かが何をすべきか知っている?あなたは私の入力を持つすべてのエラーを見ていますか?

のおかげで /マズダク教

役に立ちましたか?

解決

私はそれはあなたがlong max_range[]引数に渡す値の姿。機能があり(それがlong整数の配列を要求する)long整数へのポインタを期待していますが、暗黙的にキャストされ、の値のゼロ(c_long()呼び出しの結果)の長いを渡していますNULLポインタへ。私は、関数が、その後max_rangeで渡されたアドレス、すなわちに書き込みをしようと思います。ヌルポインタ、アドレス0x00000000におけるしたがって、アクセス違反。

longに渡すmax_rangesのアレイを作成するには、最初の配列(明確にするために幾分詳細)の大きさの配列データ・タイプを乗じて配列型を作成します。

array_size = 3
ThreeLongsArrayType = c_long * array_size
あなたが他のPythonクラスの場合と同様に、

あなたは、配列をインスタンス化することができます:

array = ThreeLongsArrayType()
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top