我正在使用Python ctypes为C DLL创建Python包装器。我在用python更新内存中的值指针时遇到问题。
在本例中,我有一个具有寄存器回调函数的DLL。调用回调函数,创建无符号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()