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