用于Ctypes的Python中的Safearray

Safearray in Python for Ctypes

本文关键字:中的 Safearray Python Ctypes 用于      更新时间:2023-10-16

我试图在DLL中使用Python Ctypes提供的函数。我知道用C++编写代码会更有效,也更不错。然而,我的项目中的所有内容都是用Python编写的。因此,我需要一段时间才能将这些代码转换为C++。

我想从DLL中使用的函数类似于

int MLAPI_GetDeviceInfo(SAFEARRAY**, SAFEARRAY**) 

正如您所知,ctypes没有一个名为SAFEARRAY的数据类型。所以我试图制作一个按类和字段的结构。(事实上,当我在谷歌上搜索时,有人试图制作SAFEARRAY,但它对我不起作用,也在这里寻找类似的案例)

from ctypes import *
class SAFEARRAYBOUND(Structure):
_fields_ = [("cElements" , c_ulong),
("lLbound" , c_long)]

class SAFEARRAY(Structure):
_fields_ = [("cDims", c_ushort),
("fFeatures", c_ushort),
("cbElements", c_ulong),
("cLocks", c_ulong),
("pvData", c_void_p),
("rgsabound", SAFEARRAYBOUND * 1)]

正如官方文件中的结构声明所说,我写了两个关于SAFEARRAY和SAFEARRAYBOUND的课程。

然后,我使用ctypes编写了用于函数使用的代码。

getdevicedata = Dll['MLAPI_GetDeviceInfo']
getdevicedata.restype = c_int
getdevicedata.argtypes = ()
getdevicedata()

我很不确定该为参数类型写什么。此外,我还不确定该把什么作为我所写的getdevicedata函数的参数。这些都是我的大部分代码。我尝试了很多组合的论点,但都失败了。所以我来Stackoverflow寻求你的答案。。。

我对Stackoverflow和Python很陌生,所以如果我在这个论坛或代码(或两者)中犯了错误,请告诉我。感谢阅读。祝你今天愉快。

假设您的结构是正确的(注意,由于数组大小可变,它们需要更多的工作),则.argtypes为:

getdevicedata.argtypes = POINTER(POINTER(SAFEARRAY)),POINTER(POINTER(SAFEARRAY))