2009-06-15 12 views
0

Hey!気づいたことがあるかもしれませんが、私はctypesに迷惑な問題があります。私は機器と通信しようとしているので、DLLドライバと通信するためにctypesを使用する必要があります。Pythonのctypes、DLL内の関数を呼び出す際の問題

は、これまでのところ、私はこの実行して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、マニュアルに従って以下の値があまりにも正確です私は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)) 

シリアル番号がしかし、変数への参照のうえによって検閲与えられ、書き込みWindowsのアクセス違反を得続ける理由を、私は知りません。誰かが何をすべきかを知っていますか?私の入力に間違いはありますか?

おかげ /マズダク教

答えて

3

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

max_rangeに渡すlongの配列を作成するには、最初に(明確にするため、やや冗長)配列のサイズと配列データ型を乗じて配列型を作成します。

array_size = 3 
ThreeLongsArrayType = c_long * array_size 

することができます他のPythonクラスと同様に配列をインスタンス化してください:

array = ThreeLongsArrayType() 
+0

Ow!それは本当です!、それを完全に逃した、それはそれでなければなりません。では、どうやってc_long()で配列を宣言するのですか?arrayLong = c_long()* 3? 原因c_longをarrayLongに変更すると、パラメータ7(ctypes.argumentError)の変換方法がわからないことがわかります –

+0

私の答えにその方法を追加しました:) – Steef

+0

ありがとう!それは完璧に働いた、私の痛みを和らげてくれてありがとう=) –

関連する問題