我已经开始围绕一个 C/C++ 库编写一个非常简单的 Python 绑定,由于法律原因,由于我没有权限,我不能在这里分享。
这包含一个 WINFUNCTYPE() 作为回调,然后可用于装饰一个函数以用作 python 中的回调,并在我绑定的函数的 argtypes 中定义。
这是代码中的样子:
from ctypes import *
from ctypes.wintypes import *
dll = WinDLL('path\\to\\dll')
callback = WINFUNCTYPE(None, POINTER(c_void_p), POINTER(LPBYTE), DWORD, c_ulonglong)
func = dll.FunctionImBinding
func.restype = POINTER(c_void_p)
func.argtypes = [LPCWSTR, callback, c_ulonglong, DWORD, DWORD]
然后我可以像这样使用它
@callback
def callback_func(*args):
#Do something with args
pass
func('string', callback_func, 0, 1, 2)
这很好,并且按预期工作,没有问题。
当我做这样的事情时,问题就来了:
func('string', None, 0, 1, 2)
我收到以下错误:
ctypes.ArgumentError: argument 2: <class 'TypeError'>: expected WinFunctionType instance instead of NoneType
这是完全清楚的原因。ctypes 期望将 WINFUNCTYPE() 视为第二个参数,而不是 NoneType,但在我使用的 SDK 的文档中,它指出将回调设置为 NULL 是可能的。但我只是不知道如何解决它,而且我很难在网上或 ctypes 文档中找到任何东西。
这是我第一次尝试绑定 C/C++ 库,如果我忽略了一些明显的东西,请原谅我。如果有人可以帮助我解决这个问题,我将非常感激。