【问题标题】:Safearray in Python for Ctypes用于 Ctypes 的 Python 中的 Safearray
【发布时间】:2020-01-15 22:17:25
【问题描述】:

我试图在使用 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 寻求你的答案......

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

【问题讨论】:

  • 您好,能否分享一下您的代码如何访问 MLAPI_GetDeviceInfo 函数?我也在尝试使用 MSI 神秘灯 API 来检查任何兼容的设备,但我无法让它工作。谢谢!

标签: python c++ dll ctypes safearray


【解决方案1】:

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

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

【讨论】:

  • 您好,请您详细说明“请注意,由于数组大小可变,因此需要更多工作”?我面临与 OP 相同的问题,但我仍然不知道如何解决。谢谢
猜你喜欢
  • 1970-01-01
  • 2012-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多