我正在使用ctypes包装C库,以便在Python(3)中使用它。我是Python和ctypes的初学者。
其中一个函数将void*
指向数组作为参数,然后填充它。我认为数据是整数,但文档非常糟糕,所以我无法确认。我可能想尝试其他类型,但我在这里试过c_int
。
MY_API ULONG GetImage ( DWORD width, DWORD height, void * lpRawData);
我需要使用Python访问存储在此数组中的值。 到目前为止,我已经尝试像这样配置argtypes,但它失败了。
from ctypes import windll, c_int, POINTER, byref
from ctypes.wintypes import DWORD, ULONG
# Height and Width are known
width = 47
height = 45
# Loading the Library
self._lib = windll.LoadLibrary('lib/myLib.dll')
# Building the reference to the C function
self.CGetImage = self._lib.GetImage
self.CGetImage.argtypes = (DWORD, DWORD, POINTER(c_int * (width*height)) )
self.CGetImage.restype = ULONG
# Creating the array storing the data
rawData = c_int * (width * height)
self.CGetImage( DWORD(width), DWORD(height), byref(rawData) )
返回byref argument must be a ctypes instance, not '_ctypes.PyCArrayType'
不幸的是,我是初学者,我无法真正了解我在其他SO帖子的ctypes文档中发现的内容,通常是在谈论numpy
库。通常在这些帖子中,C API中定义的类型也比void*
更明确,并且通常被认为是返回值而不是参数(尽管我猜它不会改变很多工作方式围绕这个问题)。
我如何从我的C库中获取这些数据,以便将它们作为int或双倍操作Python?