通过void *传递数组,并在python ctypes中返回数组

时间:2015-04-03 15:22:03

标签: python arrays ctypes

我正在使用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?

0 个答案:

没有答案