首页 > 解决方案 > 在 python 中,我如何设置 LP_c_ubyte 的值

问题描述

我正在使用 python ctypes 为 C DLL 创建一个 Python 包装器。我无法使用 python 更新指向内存中值的指针。

在此示例中,我有一个具有注册回调函数的 DLL。调用回调函数创建 unsigned char 变量,将指向该变量的指针传递给回调函数,然后打印该变量的更新值。

我期望发生的是 python 函数callbackUpdateValue将更新 的值foo,并且更新的值将打印在 C DLLDoCallBack函数中。的值0被打印出来,而不是期望值99

我的问题是: 在 python 中,如何更新fooin的值callbackUpdateValue以便可以在 C DLLDoCallBack函数中打印?

我已经尽可能地最小化了我的代码

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() 

标签: pythonc++callbackctypesloadlibrary

解决方案


定义python回调的正确方法是

def callbackUpdateValue( foo ):
    foo[0] = 99

wherefoo[0]取消引用指针。更多信息可以在这里找到:https ://docs.python.org/2.5/lib/ctypes-callback-functions.html


推荐阅读