【发布时间】:2011-12-15 15:47:27
【问题描述】:
我必须在 Python 中定义一个回调函数,该函数将从 DLL 中调用。
BOOL setCallback (LONG nPort, void ( _stdcall *pFileRefDone) (DWORD nPort, DWORD nUser), DWORD nUser);
我尝试了这段代码,它似乎在 Python 2.5 中有效,但在 Python 2.7 中它崩溃了,我认为我做错了什么。
import ctypes, ctypes.wintypes
from ctypes.wintypes import DWORD
def cbFunc(port, user_data):
print "Hurrah!"
CB_Func = ctypes.WINFUNCTYPE(None, DWORD, DWORD)
mydll.setCallback(ctypes.c_long(0), CB_Func(cbFunc), DWORD(0))
错在哪里?
注意:该平台仅在 32 位(Windows 和 Python)上运行。 DLL 加载成功,并且在从 Python 调用时,内部的其他函数也可以正常工作。
在https://github.com/ssbarnea/pyHikvision 上提供了一个完整的示例代码,可以在 py25 和 py27 下运行 Video.py。
【问题讨论】:
-
第一行给出的函数指针指向返回
void的函数,而不是void*。 -
如果我的第一条评论不够清楚:这与
WINFUNCTYPE的返回类型声明相矛盾,即c_void_p。 -
使用
None表示返回类型void。史蒂文是谁,顺便说一句? :) -
您无需在回调中使用
ctypes.py_object(self)来访问self。我们已经在您之前的问题中告诉过您。但是,您似乎打算按照自己的方式去做。这取决于你。对我来说,self可以可靠地转换为 32 位 int 远非显而易见。另外,你的 Python 是 32 位还是 64 位? -
cbFunc在模块范围内吗?您的代码显然不完整,因为那里有一个self。我想知道cbFunc是否是一个本地函数,当它的封闭函数结束时会超出范围。在模块范围内尝试使用cbFunc。
标签: python callback ctypes stdcall