【发布时间】:2020-09-28 07:43:45
【问题描述】:
我有两个不同的 C 函数,我想在 Python 中将它们与 ctypes 一起使用。
一个函数正在建立一个连接并返回一个指向结构的指针。该指针应用作第二个函数中的参数以重用已建立的连接。
C 代码:
customStruct * connect()
{
customStruct *obj = connection_helper();
return obj;
}
void foo(customStruct * obj)
{
foo_helper(obj);
}
Python 代码:
from ctypes import *
lib = CDLL("./test.dll")
obj = lib.connect()
lib.foo(obj)
不幸的是,当我调用lib.foo() 时,我检索到访问冲突错误。我可以使用具有_fields_ 属性的类在Python 中重新创建customStruct 结构,但是由于该结构由许多其他结构组成,并且由于我不想访问Python 本身中的结构成员,所以我正在考虑另一种如何创建可重复使用的标识符。
我可以随意更改connect() 和foo() 的定义。如果我不必在 python 中重新创建结构,我还可以创建另一个“标识符”结构。
更新:
看来我必须使用函数byref() 来实现我想要的。
https://docs.python.org/3/library/ctypes.html#ctypes.byref
文档声明“返回的对象只能用作外部函数调用参数”,但我不确定在 connect() 中返回什么。
【问题讨论】:
-
你需要在你的函数上设置
argtypes和restype。 -
谢谢。将 argtypes 设置为
[c_void_p]有效。