Мне нужно установить адрес, на который указывает символьный указатель, как абсолютное значение.
Во многих реализациях Python (CPyhton 2.x, CPython 3.x, PyPy & ActivePython, ...)это можно сделать с помощью:
>>> c_char_p(0xcafebabe)
c_char_p(3405691582)
>>>
в IronPython:
>>> c_char_p(0xcafebabe)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: expected char pointer, got long
>>>
IronPython не пытается установить адрес указателя, но обрабатывает аргумент как содержимое и затем возвращает типконфликт.Однако функциональность других дистрибутивов Python, упомянутых выше, не относится к IronPython.
Что я могу сделать, чтобы установить c_char_p
в абсолютный адрес в IronPython?
Фон для моеговопрос:
Я разработал DLL, написанную на Delphi.Назначение библиотеки DLL - иметь внешний интерфейс к приложению Delphi.Я могу успешно управлять приложением через DLL на C и C ++.Клиенты запросили более удобное решение -> они хотят управлять приложением с помощью Python.Я разработал пакет Python, который на самом деле намного проще в использовании.Все функции DLL должны вызываться с указателем на структуру того же типа, которая представляет устройство.Первая функция, которую нужно вызвать, - это функция Init библиотеки DLL, которая инициализирует структуру со значениями по умолчанию.К сожалению, в конструкции структуры отсутствует важный элемент - настройка параметров RS232, поскольку поддержка устройств RS232 не планировалась в первой версии DLL.Чтобы по-прежнему обеспечивать поддержку RS232, библиотека DLL была изменена для использования абсолютного адреса существующего символа * в структуре устройства в качестве сигнала.Если этот символ * имеет абсолютный адрес 0xCAFEBABE, DLL анализирует строку конфигурации, которая была помещена в другой символ * структуры.Это уродливое решение работает очень хорошо, и атрибуты структуры не должны были быть изменены.Все отлично работает при управлении DLL / приложением с помощью CPyhton 2.x, CPython 3.x, PyPy & ActivePython.К сожалению, IronPython сообщает об ошибке при попытке установить указатель на абсолютный адрес.