0

私は 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 は、NoneType ではなく 2 番目の引数として WINFUNCTYPE() が表示されることを期待していますが、使用している SDK のドキュメントには、コールバックを NULL として設定することが可能であると記載されています。しかし、それを修正する方法がわからないだけで、オンラインまたは ctypes ドキュメントで何かを見つけるのに苦労しています。

C/C++ ライブラリをバインドしようとしたのはこれが初めてなので、明らかな見落としがあればご容赦ください。誰かが私がこれを解決するのを手伝ってくれるなら、私は本当に素晴らしいでしょう.

4

2 に答える 2