Я создаю оболочку Python для C DLL, используя Python ctypes.У меня возникают проблемы при обновлении указателя на значение в памяти с Python.
В этом примере у меня есть DLL, которая имеет функцию обратного вызова регистра.Вызывающая функция обратного вызова, которая создает переменную char без знака, передает указатель на эту переменную в функцию обратного вызова, а затем печатает обновленное значение этой переменной.
Я ожидал, что функция python callbackUpdateValue
обновит значение foo
, а обновленное значение будет напечатано в функции C DLL DoCallBack
.Значение 0
выводится вместо ожидаемого значения 99
Мой вопрос: В Python как мне обновить значение foo
в callbackUpdateValue
, такчто он может быть напечатан в функции C DLL DoCallBack
?
Я максимально уменьшил свой код
DLL C ++ Code
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 устанавливает функцию обратного вызова, а затем вызывает функцию DoCallBack из DLL.
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()