1

有一个来自 DLL(C 语言)的函数,link("parameters", &connection);它接受一个字符串参数并初始化一个连接。

有一个函数connect(connection)connection通过调用初始化的对象在哪里link()

我将 Python 连接对象connect()作为参数传递给函数

connection_t = ctypes.c_uint32
link = mydll.link
link.argtypes=(ctypes.c_char_p, ctypes.POINTER(connection_t) )
connect = mydll.connect
connect.argtypes=(connection_t,)
...
connection = connection_t()
link ("localhost: 5412", ctypes.byref(connection))
...

但是,如果我将“连接”对象传输到 mydll 库的任何其他函数,该函数会返回一个值,但该值不正确。

func=mydll.func
status_t=ctypes.c_uint32
status=status_t()
func.argtypes=(ctypes.c_ulong,ctypes.POINTER(status_t))
result=func(connection, ctypes.byref(status))

在此示例result=0中,但在此代码的 C 变体中,我收到了正确的值(不是 0)

为什么?

4

1 回答 1

0

根据您描述 C api 的评论:

link(const char* set, conn_type* connection );
func(conn_type* connection, uint32_t* status);

因为 func 需要一个指向连接类型的指针,所以代码应该是这样的:

mydll=ctypes.CDLL('mydll')
connection_t = ctypes.c_uint32
link = mydll.link
link.argtypes=(ctypes.c_char_p, ctypes.POINTER(connection_t) )
connection = connection_t()
link("localhost: 5412", ctypes.byref(connection))

func=mydll.func
status_t=ctypes.c_uint32
status=status_t()
func.argtypes=(ctypes.POINTER(connection_t),ctypes.POINTER(status_t))
result=func(ctypes.byref(connection), ctypes.byref(status))
于 2012-04-28T20:33:08.730 回答