在 python 中如何设置 LP_c_ubyte 的值
In python how do I set the value of a LP_c_ubyte
我正在使用 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()
定义 python 回调的正确方法是
def callbackUpdateValue( foo ):
foo[0] = 99
其中 foo[0]
取消引用指针。可以在此处找到更多信息:https://docs.python.org/2.5/lib/ctypes-callback-functions.html
我正在使用 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()
定义 python 回调的正确方法是
def callbackUpdateValue( foo ):
foo[0] = 99
其中 foo[0]
取消引用指针。可以在此处找到更多信息:https://docs.python.org/2.5/lib/ctypes-callback-functions.html