python - 在 python 中,我如何设置 LP_c_ubyte 的值
问题描述
我正在使用 python ctypes 为 C DLL 创建一个 Python 包装器。我无法使用 python 更新指向内存中值的指针。
在此示例中,我有一个具有注册回调函数的 DLL。调用回调函数创建 unsigned char 变量,将指向该变量的指针传递给回调函数,然后打印该变量的更新值。
我期望发生的是 python 函数callbackUpdateValue
将更新 的值foo
,并且更新的值将打印在 C DLLDoCallBack
函数中。的值0
被打印出来,而不是期望值99
我的问题是: 在 python 中,如何更新foo
in的值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()
解决方案
定义python回调的正确方法是
def callbackUpdateValue( foo ):
foo[0] = 99
wherefoo[0]
取消引用指针。更多信息可以在这里找到:https ://docs.python.org/2.5/lib/ctypes-callback-functions.html
推荐阅读
- arrays - 按属性排序数组而不使用第一个对象
- ios - 调用“停止”功能时,如何逐渐减慢计时器的速度?
- python - Django rest框架不正确的嵌套序列化
- marklogic - 不显示在 MarkLogic 上创建的集合以在 Geoserver 中创建图层
- reactjs - 如何在通用 React / React Native 项目中用玩笑收集覆盖率
- python - 如何查看 Kaggle 笔记本的内存使用情况?
- javascript - 如何使具有不同单词的多个数组在游戏屏幕上移动?
- amazon-web-services - 带有光线的 AWS SageMaker RL:ray.tune.error.TuneError:未指定可训练
- sql - 如何将 PARAMETERS 传递给 MS ACCESS 中的另一个查询(没有 VBA)?
- python - 相当具体的数据框查询