2012-06-19 41 views
1

我需要在Python下面的C函數:使用C型在Python

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: an integer is required

什麼是錯在這裏與參數?

回答

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)) 
+0

Thx。工作正常! – leon22

0

你試過用windll而不是cdll加載dll嗎?也....不是指針,而是POINTER?

+0

指針和指針是一樣的! – leon22

+0

@ leon22 POINTER是一種類型。指針是一個實例。 –

+1

@ leon22,澄清。 'POINTER(type)'接受一個類型併爲該類型創建一個指針類型。 'pointer(instance)'接受一個實例並實例化一個指向該實例的指針。 –

2

無不是整數。

c_int的(無)會導致類型錯誤

初始化爲0的變量,不無

0

從你初始化的recvBufferrecvLength猜測你想要創建空指針。

在這種情況下你應該沒有特定類型的參數來創建一個實例,請執行以下操作:

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

funcFunction(recvBuffer, recvLength) 

,如果你有蟒蛇內的緩衝區,你需要你的固定大小的數組轉換爲正確的指針類型。