1

Pythonで次のC関数が必要です。

int func(Uint8 *bytRecvBuffer, int *iRecvLen);

Pythonで試しました:

mydll = cdll.LoadLibrary("my.dll")

recvBuffer = None
recvLength = None

funcFunction = getattr(mydll, "func")
funcFunction(POINTER(c_ubyte(recvBuffer)), POINTER(c_int(recvLength)))

エラーメッセージ:

TypeError:整数が必要です

ここでパラメータの何が問題になっていますか?

4

4 に答える 4

2

None は整数ではありません。

c_int(None) は TypeError を引き起こします

変数を None ではなく 0 で初期化します

于 2012-06-19T14:10:23.470 に答える
2

実際のバッファと整数を割り当てる必要があります。

from ctypes import *
mydll = CDLL("my")
recvBuffer = create_string_buffer(1000)
recvLength = c_int(1000)
mydll.func(recvBuffer,byref(recvLength))

func でサポートされている特定のパラメーターを宣言することもできますが、渡されるパラメーターについてより明確にする必要があります。

mydll.func.argtypes = [POINTER(c_ubyte),POINTER(c_int)]
mydll.func.restype = c_int
recvBuffer = (c_ubyte*1000)()
recvLength = c_int(1000)
mydll.func(recvBuffer,byref(recvLength))
于 2012-06-19T14:44:30.100 に答える
0

cdllの代わりにwindllを使用してdllをロードしてみましたか?また....POINTERの代わりにポインタではありませんか?

于 2012-06-19T13:55:22.797 に答える
0

初期化から推測して、ヌルポインターを作成recvBufferrecvLengthたいと考えています。

その場合、特定の型の引数なしでインスタンスを作成する必要があります。次の手順を実行します。

recvBuffer = POINTER(c_ubyte)()   
recvLength = POINTER(c_int)()

funcFunction(recvBuffer, recvLength)

Python 内でバッファーを取得した場合は、固定サイズの配列を正しいポインター型にキャストする必要があります。

于 2012-06-19T14:55:08.750 に答える