Python 中的 Safearray for Ctypes
Safearray in Python for Ctypes
我试图在使用 Python Ctypes 提供的 DLL 中使用函数。我确实知道用 C++ 编写代码会更高效、更好。但是,我的项目中的所有内容都是用 Python 编写的。所以我需要一段时间才能将这段代码转换成 C++。
我想从 DLL 中使用的函数是这样的
int MLAPI_GetDeviceInfo(SAFEARRAY**, SAFEARRAY**)
如您所知,ctypes 没有名为 SAFEARRAY 的数据类型。所以我试图通过 Class 和字段制作一个结构。 (其实我谷歌的时候有人试图制作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 and SAFEARRAYBOUND。
然后我用ctypes写了代码供函数使用
getdevicedata = Dll['MLAPI_GetDeviceInfo']
getdevicedata.restype = c_int
getdevicedata.argtypes = ()
getdevicedata()
我不确定要为 argtypes 写什么。此外,我非常不确定将什么作为我编写的 getdevicedata 函数的参数。这些几乎是我的代码。我为参数尝试了一堆组合,但一切都失败了。所以我来到 Whosebug 寻求您的答案...
我对 Whosebug 和 Python 非常陌生,所以如果我在这个论坛或代码(或两者)中犯了错误,请告诉我。谢谢阅读。祝你有个愉快的一天。
假设你的结构是正确的(注意他们需要更多的工作,因为数组的大小是可变的),.argtypes
是:
getdevicedata.argtypes = POINTER(POINTER(SAFEARRAY)),POINTER(POINTER(SAFEARRAY))
我试图在使用 Python Ctypes 提供的 DLL 中使用函数。我确实知道用 C++ 编写代码会更高效、更好。但是,我的项目中的所有内容都是用 Python 编写的。所以我需要一段时间才能将这段代码转换成 C++。
我想从 DLL 中使用的函数是这样的
int MLAPI_GetDeviceInfo(SAFEARRAY**, SAFEARRAY**)
如您所知,ctypes 没有名为 SAFEARRAY 的数据类型。所以我试图通过 Class 和字段制作一个结构。 (其实我谷歌的时候有人试图制作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 and SAFEARRAYBOUND。
然后我用ctypes写了代码供函数使用
getdevicedata = Dll['MLAPI_GetDeviceInfo']
getdevicedata.restype = c_int
getdevicedata.argtypes = ()
getdevicedata()
我不确定要为 argtypes 写什么。此外,我非常不确定将什么作为我编写的 getdevicedata 函数的参数。这些几乎是我的代码。我为参数尝试了一堆组合,但一切都失败了。所以我来到 Whosebug 寻求您的答案...
我对 Whosebug 和 Python 非常陌生,所以如果我在这个论坛或代码(或两者)中犯了错误,请告诉我。谢谢阅读。祝你有个愉快的一天。
假设你的结构是正确的(注意他们需要更多的工作,因为数组的大小是可变的),.argtypes
是:
getdevicedata.argtypes = POINTER(POINTER(SAFEARRAY)),POINTER(POINTER(SAFEARRAY))