Transaq

СБО "Transaq" => TRANSAQ Connector => Topic started by: Janso on Февраля 19, 2021, 05:22:27 pm

Title: FreeMemory и python
Post by: Janso on Февраля 19, 2021, 05:22:27 pm
Проблемы с написанием кода в питоне:

использование freememory делает непонятно что, ошибок не выдает, но код идущий после этого вызова не выполняется
какие-то проблемы с питоновским 'bytes' ?

dll = ctypes.WinDLL("txmlconnector64.dll")

def callback(incoming_msg):   
    print(etree.tostring(etree.XML(incoming_msg), pretty_print=True, encoding="utf-8").decode())
    dll.FreeMemory(incoming_msg)

callbackPrototype = ctypes.WINFUNCTYPE(ctypes.c_bool, ctypes.c_char_p)
callbackPtr = callbackPrototype(callback)





вообще есть у кого-то хоть какието работающие примеры на питоне?
приходится извращаться с ctypes без особого понимания, что во что конвертируется...
документация отвратительная, примеры только на # - там сидеть копаться днями чтобы понять что к чему


Title: Re: FreeMemory и python
Post by: Сорвачев Сергей on Февраля 19, 2021, 06:00:35 pm
использование freememory делает непонятно что, ошибок не выдает, но код идущий после этого вызова не выполняется
какие-то проблемы с питоновским 'bytes' ?

В документации есть описание данной функции и ее сигнатуры. Функция выполняеточистку памяти, выделенной библиотекой. Возвращаемое значение - bool, параметр - unsigned char*.

Проблемы с написанием кода в питоне:

использование freememory делает непонятно что, ошибок не выдает, но код идущий после этого вызова не выполняется
какие-то проблемы с питоновским 'bytes' ?

dll = ctypes.WinDLL("txmlconnector64.dll")

def callback(incoming_msg):   
    print(etree.tostring(etree.XML(incoming_msg), pretty_print=True, encoding="utf-8").decode())
    dll.FreeMemory(incoming_msg)

callbackPrototype = ctypes.WINFUNCTYPE(ctypes.c_bool, ctypes.c_char_p)
callbackPtr = callbackPrototype(callback)

В приведенном примере нет кода после dll.FreeMemory(incoming_msg).

вообще есть у кого-то хоть какието работающие примеры на питоне?
приходится извращаться с ctypes без особого понимания, что во что конвертируется...
документация отвратительная, примеры только на # - там сидеть копаться днями чтобы понять что к чему

TXmlConnector написан на C++ под Windows. Код на C#, Python и Java - авторское видение и адаптация под нужный автору язык.
Пример авторского видения:
    def __init__(self, path):
        self.__ucallback = None
        self.lib = windll.LoadLibrary(path)
        self.__SetFunctions()
        self.__SetCallback(self.__xcallback)

    def __SetFunctions(self):
        self.func_init = self.lib.Initialize
        self.func_init.restype = c_void_p
        self.func_uninit = self.lib.UnInitialize
        self.func_uninit.restype = c_void_p
        self.func_set_callback = self.lib.SetCallback
        self.func_set_callback.restype = c_bool
        self.func_send_cmd = self.lib.SendCommand
        self.func_send_cmd.restype = c_void_p
        self.func_free_mem = self.lib.FreeMemory
        self.func_free_mem.restype = c_bool
        self.func_service_info = self.lib.GetServiceInfo
        self.func_service_info.restype = c_int

    def SetUserCallback(self, fun) :
        self.__ucallback = fun

    def __SetCallback(self, func) :
        prototype = WINFUNCTYPE(c_bool, POINTER(c_ubyte))
        self.__callback_func = prototype(self.__xcallback)
        res = self.func_set_callback(self.__callback_func)
        if (not res) :
            print("Failed to set callback")

    def __xcallback(self, data):
        py_data = cast(data, c_char_p).value.decode(XC_ENCODING)
        self.func_free_mem(data)
        if (not self.__ucallback == None) :
         self.__ucallback(py_data)
        return 0
Title: Re: FreeMemory и python
Post by: Janso on Февраля 19, 2021, 06:19:36 pm
Из вашего сообщения я ухватил другой тип и добавил себе
callbackPrototype = ctypes.WINFUNCTYPE(ctypes.c_bool, ctypes.POINTER(ctypes.c_ubyte))

теперь freememory вроде работает, но данные в колбэк приходят не в том формате
<__main__.LP_c_ubyte object at 0x000002127E854C40>
<class '__main__.LP_c_ubyte'>
<__main__.LP_c_ubyte object at 0x000002127E854C40>
<class '__main__.LP_c_ubyte'>
<__main__.LP_c_ubyte object at 0x000002127E854C40>
<class '__main__.LP_c_ubyte'>

как их превратить в строку или ctypes.c_char_p?
Title: Re: FreeMemory и python
Post by: Сорвачев Сергей on Февраля 19, 2021, 06:26:03 pm
Полагаю, что так:
XC_ENCODING = 'utf-8'
py_data = cast(data, c_char_p).value.decode(XC_ENCODING)

data - входной параметр вашей callback-функции
py_data - выходной объект-строка
Title: Re: FreeMemory и python
Post by: Сорвачев Сергей on Февраля 19, 2021, 06:30:19 pm
Пример полного класса-обертки для xmlconnector.dll
Title: Re: FreeMemory и python
Post by: Janso on Февраля 19, 2021, 06:38:38 pm
Полагаю, что так:
XC_ENCODING = 'utf-8'
py_data = cast(data, c_char_p).value.decode(XC_ENCODING)

data - входной параметр вашей callback-функции
py_data - выходной объект-строка

большое спасибо, сработало
и за обертку

буду тестировать дальше