Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?
Декабря 09, 2021, 07:47:00 am
Начало Помощь Поиск Войти Регистрация
Новости:

Transaq  |  СБО "Transaq"  |  TRANSAQ Connector  |  Topic: FreeMemory и python « предыдущая тема следующая тема »
Страниц: [1] Печать
Автор Тема: FreeMemory и python  (Прочитано 648 раз)
Janso
Newbie
*
Сообщений: 3


Просмотр профиля Email
« : Февраля 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 без особого понимания, что во что конвертируется...
документация отвратительная, примеры только на # - там сидеть копаться днями чтобы понять что к чему


Записан
Сорвачев Сергей
Разработчики
Newbie
*****
Сообщений: 27


Просмотр профиля Email
« Ответ #1 : Февраля 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
Записан
Janso
Newbie
*
Сообщений: 3


Просмотр профиля Email
« Ответ #2 : Февраля 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?
Записан
Сорвачев Сергей
Разработчики
Newbie
*****
Сообщений: 27


Просмотр профиля Email
« Ответ #3 : Февраля 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 - выходной объект-строка
Записан
Сорвачев Сергей
Разработчики
Newbie
*****
Сообщений: 27


Просмотр профиля Email
« Ответ #4 : Февраля 19, 2021, 06:30:19 pm »

Пример полного класса-обертки для xmlconnector.dll
Записан
Janso
Newbie
*
Сообщений: 3


Просмотр профиля Email
« Ответ #5 : Февраля 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 - выходной объект-строка

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

буду тестировать дальше
Записан
Страниц: [1] Печать 
Transaq  |  СБО "Transaq"  |  TRANSAQ Connector  |  Topic: FreeMemory и python « предыдущая тема следующая тема »
Перейти в:  


Войти

Powered by MySQL Powered by PHP Powered by SMF 2.0.10 | SMF © 2006-2008, Simple Machines LLC Valid XHTML 1.0! Valid CSS!