簡體   English   中英

如何允許將 NoneType Arguments 或回調 function 傳遞給 ctypes 中的 function

[英]How do I allow NoneType Arguments OR a callback function to be passed to a function in ctypes

我已經開始圍繞一個 C/C++ 庫編寫一個非常簡單的 Python 綁定,由於法律原因,由於我沒有權限,我無法在此分享。

這包含一個 WINFUNCTYPE() 作為回調,然后可用於裝飾 function 以用作 python 中的回調,並在我的 ZC1C425268E68385D1AB5074C1 綁定的 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++ 庫,如果我忽略了一些明顯的東西,請原諒我。 如果有人可以幫助我解決這個問題,我將非常感激。

您可以通過在創建回調時傳遞地址 0 給它一個 null function 指針:

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

事實上,我查看了 OP 發布的答案中的鏈接,稍后在線程中它具有基本相同的東西......將 None 轉換為回調類型,例如cast(None, callback)

好的,我在這里找到了解決方案https://ctypes-users.narkive.com/wmJNDPu2/optional-callbacks-passing-null-for-function-pointers

將澄清我在這里所做的事情,而不是刪除問題。

定義一個自定義的 from_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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM