我正在使用python ctypes为C DLL创建一个Python包装器。我在使用python更新指向内存中值的指针时遇到问题。
在这个例子中,我有一个具有寄存器回调函数的DLL。一个调用回调函数,它创建unsigned char变量,将指向该变量的指针传递给回调函数,然后打印该变量的更新值。
我期望发生的是python函数callbackUpdateValue
将更新foo
的值,更新的值将打印在C DLL DoCallBack
函数中。打印0
的值而不是99
我的问题是:在python中如何更新foo
中callbackUpdateValue
的值,以便可以在C DLL DoCallBack
函数中打印?
我尽可能地减少了我的代码
DLL C ++代码
DLL有两个功能。一个用于注册回调,另一个用于调用回调并打印结果。
#include <stdio.h>
typedef void(*FPCallback)(unsigned char * foo);
FPCallback g_Callback;
extern "C" __declspec( dllexport ) void RegisterCallback(void(*p_Callback)(unsigned char * foo)) {
g_Callback = p_Callback ;
}
extern "C" __declspec( dllexport ) void DoCallBack() {
unsigned char foo = 0 ;
g_Callback( &foo );
printf( "foo=%d\n", foo);
}
Python代码
python代码设置回调函数,然后从DLL调用DoCallBack函数。
from ctypes import *
def callbackUpdateValue( foo ):
foo = 99
customDLL = cdll.LoadLibrary ("customeDLL.dll")
# RegisterCallback
CustomDLLCallbackFUNC = CFUNCTYPE(None, POINTER( c_ubyte))
CustomDLLCallback_func = CustomDLLCallbackFUNC( callbackUpdateValue )
RegisterCallback = customDLL.RegisterCallback
RegisterCallback.argtypes = [ CustomDLLCallbackFUNC ]
RegisterCallback( CustomDLLCallback_func )
# DoCallBack
DoCallBack = customDLL.DoCallBack
# Call the callback
DoCallBack()
答案 0 :(得分:2)
定义python回调的正确方法是
def callbackUpdateValue( foo ):
foo[0] = 99
其中foo[0]
取消引用指针。更多信息可以在这里找到:https://docs.python.org/2.5/lib/ctypes-callback-functions.html