Python中的Safearray用于Ctypes

2024-04-24 11:43:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在使用Python Ctypes提供的DLL中使用一个函数。我知道在C++中编写一个代码会更有效率和更好的选择。但是,我的项目中的所有内容都是用Python编写的。所以我需要一段时间将这个代码转换成C++。你知道吗

我想从DLL中使用的函数是这样的

int MLAPI_GetDeviceInfo(SAFEARRAY**, SAFEARRAY**) 

如您所知,ctypes没有名为SAFEARRAY的数据类型。所以我试着用类和字段来构造一个结构。(事实上,当我在google上搜索时,有人试图制作SAFEARRAY,但是它对我不起作用,还寻找类似的案例here

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)]

正如官方文档中的结构声明所说,我编写了两个关于SAFEARRAYSAFEARRAYBOUND的类。你知道吗

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

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

我很不确定要为argtypes写什么。另外,我很不确定应该把什么作为我编写的getdevicedata函数的参数。这些几乎是我的代码。我尝试了一系列的论点组合,但都失败了。所以我来找你的答案。。。你知道吗

我对Stackoverflow和Python很在行,所以如果我在这个论坛或代码(或两者)中犯了错误,请告诉我。谢谢你的阅读。祝您有个美好的一天。你知道吗


Tags: 函数代码fieldsctypesstructure结构classint
1条回答
网友
1楼 · 发布于 2024-04-24 11:43:54

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

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

相关问题 更多 >