在Python中,如何设置LP_C_UBYTE的值
In python how do I set the value of a LP_c_ubyte
我正在使用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
相关文章:
- 数组索引的值没有增加
- 'short int'持有的值溢出,但"自动"不会溢出?
- 是默认情况下分配给char数组常量的值
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 为什么我无法更改"set<set>"循环中的值<int>
- 有效地使用std::unordered_map来插入或增加键的值
- <streamsize>C++ 中 numeric_limits::max() 的值
- 为什么不能修改对象中的值?另外,我如何改进此链表?
- 无法获取webot::PositionSensor对象中位置传感器的值
- 正在将无序映射设置为无序映射的值
- 着色器纹理值与创建纹理时写入的值不同
- 无法按cpp中的值返回矢量
- 指针没有更新它在void函数内部指向的值
- 不能将 "void *" 类型的值分配给类型 "TCHAR" 的实体
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 如何在c++中获取要更新的值
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?