我正在尝试使用DLL中的一个函数,该函数是通过Python C类型提供的。我知道用C++编写代码会更有效率,也更好。但是,我的项目中的所有内容都是用Python编写的。所以我需要一段时间才能将这段代码转换成C++。
我想从DLL中使用的函数如下所示
int MLAPI_GetDeviceInfo(SAFEARRAY**, SAFEARRAY**) 正如您所知道的,ctype没有名为SAFEARRAY的数据类型。所以我试着按类和字段来创建一个结构。(其实有人在我谷歌的时候想做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)]正如官方文档中的结构声明所说,我编写了两个关于SAFEARRAY和SAFEARRAYBOUND的类。
然后,我使用ctype编写了代码以供函数使用。
getdevicedata = Dll['MLAPI_GetDeviceInfo']
getdevicedata.restype = c_int
getdevicedata.argtypes = ()
getdevicedata()我不确定要为argtype写些什么。另外,我也不确定我写的getdevicedata函数的参数是什么。这些是我的大部分代码。我尝试了一堆参数的组合,但都失败了。所以我来Stackoverflow找你的答案...
我对Stackoverflow和Python非常陌生,所以如果我在这个论坛或代码(或两者)中犯了错误,请让我知道。感谢您的阅读。祝您今天愉快。
发布于 2019-09-17 01:05:26
假设您的结构是正确的(请注意,由于数组的大小可变,它们需要做更多的工作),.argtypes为:
getdevicedata.argtypes = POINTER(POINTER(SAFEARRAY)),POINTER(POINTER(SAFEARRAY))https://stackoverflow.com/questions/57933772
复制相似问题