В Python, как мне установить значение LP_c_ubyte - PullRequest
0 голосов
/ 26 апреля 2018

Я создаю оболочку 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() 

1 Ответ

0 голосов
/ 26 апреля 2018

Правильный способ определения обратного вызова Python - это

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

, где foo[0] разыменовывает указатель.Более подробную информацию можно найти здесь: https://docs.python.org/2.5/lib/ctypes-callback-functions.html

...