0

私は現在、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)

少なくともコールバック関数のアドレスを追加する必要があるため、エラーを見つけることができません。

誰が私が間違っているかを見ることができますか?

4

1 に答える 1

0

これはベースから外れているかもしれませんが、ctypes 関数ごとに argtype と restype を定義する必要があると思います..

于 2014-05-27T17:45:34.003 に答える