在Python中,如何设置LP_C_UBYTE的值

In python how do I set the value of a LP_c_ubyte

本文关键字:LP 的值 UBYTE 设置 Python 何设置      更新时间:2023-10-16

我正在使用python ctypes为c dll创建一个Python包装器。我很难用Python更新指针以在内存中的价值。

在此示例中,我有一个具有寄存器回调函数的DLL。创建无符号char变量的调用回调函数,将该变量的指针传递给回调函数,然后打印该变量的更新值。

我期望发生的是Python函数callbackUpdateValue将更新foo的值,并且更新值将在C DLL DoCallBack函数中打印。0的值是打印的,而不是99

的预期值

我的问题是:在Python中如何更新callbackUpdateValue中的foo的值,以便可以在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=%dn", 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