python - 用于 Ctypes 的 Python 中的 Safearray
问题描述
我试图在使用 Python Ctypes 提供的 DLL 中使用一个函数。我确实知道用 C++ 编写代码会是更有效和更好的选择。但是,我项目中的所有内容都是用 Python 编写的。所以我需要一段时间才能将这段代码转换成 C++。
我想从 DLL 中使用的函数是这样的
int MLAPI_GetDeviceInfo(SAFEARRAY**, SAFEARRAY**)
如您所知,ctypes 没有称为 SAFEARRAY 的数据类型。所以我试图按类和字段制作一个结构。(其实有人在我google的时候尝试做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()
我很不确定为 argtypes 写什么。此外,我很不确定将什么作为我编写的 getdevicedata 函数的参数。这些几乎是我的代码。我为论点尝试了一堆组合,但一切都失败了。所以我来到 Stackoverflow 寻求你的答案......
我对 Stackoverflow 和 Python 很陌生,所以如果我在这个论坛或代码(或两者)中犯了错误,请告诉我。谢谢阅读。祝你今天过得愉快。
解决方案
假设你的结构是正确的(注意它们需要更多的工作,因为数组的大小是可变的),那.argtypes
就是:
getdevicedata.argtypes = POINTER(POINTER(SAFEARRAY)),POINTER(POINTER(SAFEARRAY))
推荐阅读
- hibernate - Hibernate 更新、PropertyAccessor、ChainedPropertyAccessor、PropertyAccessorFactory 在版本 5.3.7 中不再可用
- function - Elixir,使用另一个模块的函数
- python - Python 列表中的索引包含多个元素。如何访问每个并将它们传递给不同的功能?
- android - 在 IOS 问题上运行 Flutter
- c# - C# Web 窗体应用程序 Sql 命令
- sql - 获取月份第一个日期的值
- c - 释放后使用 ASAN 堆
- javascript - 使用 React Router 4 保护一组路由
- javascript - 如何以有效的方式在 JavaScript 中进行一些数组比较
- url - 登录后 Keycloak 删除 url 片段