私は現在、python と C-dll の間のインターフェースを調査しています。ctypes ライブラリを使用して、dll をロードできます。
概念実証のための非常に単純なソフトウェア セットアップがあります。DLL で呼び出す関数は、1 つの引数を想定しています。Python コードによって出力される文字列を受け取る関数への関数ポインタ。
Python コード:
lib = ctypes.WinDLL(LIB_PATH)
# 1) Create callback function type
CB_FUNC_TYPE = ctypes.CFUNCTYPE(None, ctypes.c_char_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p)
# 2) Create the function which will be called back
def foo(text):
print text
# 3) create ctype callback function
cb_func = CB_FUNC_TYPE(foo)
# 4) Call the function
print lib.Test2(cb_func)
エクスポートされた C 関数 (Test2):
__declspec(dllexport) void Test2(T_LOG_CALLBACK pf_log)
{
pf_log("Hello Python Log function!);
return;
}
Python コードを実行すると、次のエラー出力メッセージが表示されます。
Hello Python Log function!
Traceback (most recent call last):
File "C:\version\vcs\py\workspace\workspace\tests\python-c integration\test.py", line 32, in <module>
print lib.Test2(cb_func)
ValueError: Procedure probably called with too many arguments (4 bytes in excess)
つまり、コールバックは正しく実行されますが、スタックでエラーが発生しました。
C 関数には 1 つのパラメーター (この場合は関数 foo への関数ポインター) しかないため、エラーがわかりません。
行を更新すると:
cb_func = CB_FUNC_TYPE(foo)
に
print lib.Test2(cb_func, "extra")
同じエラーが発生しますが、8 バイトを超えています。
Hello Python Log function!
Traceback (most recent call last):
File "C:\version\vcs\py\workspace\workspace\tests\python-c integration\test.py", line 32, in <module>
print lib.Test2(cb_func, "extra")
ValueError: Procedure probably called with too many arguments (8 bytes in excess)
少なくともコールバック関数のアドレスを追加する必要があるため、エラーを見つけることができません。
誰が私が間違っているかを見ることができますか?