Python 如何允许非类型参数或回调函数传递给ctypes中的函数

Python 如何允许非类型参数或回调函数传递给ctypes中的函数,python,c++,ctypes,python-bindings,Python,C++,Ctypes,Python Bindings,我已经开始围绕C/C++库编写一个非常简单的Python绑定,由于法律原因,我无法在这里共享,因为我没有权限 它包含一个作为回调的WINFUNCTYPE(),然后可以用来修饰一个函数以用作python中的回调,并在绑定的函数的argtypes中定义 下面是代码中的内容: from ctypes import * from ctypes.wintypes import * dll = WinDLL('path\\to\\dll') callback = WINFUNCTYPE(None, POI

我已经开始围绕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.ArgumentError:参数2::应为WinFunctionType实例,而不是NoneType
这是完全清楚的原因。ctypes希望看到WINFUNCTYPE()作为第二个参数,而不是NoneType,但在我使用的SDK文档中,它声明可以将回调设置为NULL。但我只是不知道如何修复它,我正努力在网上或ctypes文档中找到任何东西


这是我第一次尝试绑定C/C++库,所以请原谅我忽略了一些显而易见的东西。如果有人能帮我解决这个问题,我将非常感激。

好的,我在这里找到了一个解决方案

将澄清我在这里所做的,而不是删除问题

从_param定义一个自定义参数,并在回调上使用如下类方法设置它

from ctypes import _CFuncPtr

def from_param(cls, obj):
    if obj is None:
        return None
    return _CFuncPtr.from_param(obj)

callback.from_param = classmethod(from_param)

通过在创建回调时传递地址0,可以为其提供空函数指针:

func('string', callback(0), 0, 1, 2)

事实上,我在OP发布的答案中查看了链接,后来在线程中,它基本上有相同的东西…将None转换为回调类型,例如
cast(None,callback)

谢谢,我更喜欢这个