Как создать УКАЗАТЕЛЬ на SAFEARRAY с помощью Python для COM?C++

Программы на C++. Форум разработчиков
Ответить
Гость
 Как создать УКАЗАТЕЛЬ на SAFEARRAY с помощью Python для COM?

Сообщение Гость »


Я работаю с COM-сервером на Python, используя win32com.client, и мне нужно передать массив строк методу, который ожидает POINTER на SAFEARRAY. Я попытался создать ВАРИАНТ, содержащий массив, но не знаю, как правильно преобразовать его в POINTER(SAFEARRAY), как ожидалось COM-методом ConnectData. Вот мой текущий подход:

импортировать win32com.client импортировать Pythoncom def connect_to_rtd_server(prog_id): rtd_server = win32com.client.Dispatch(prog_id) id_темы = 903 строки = win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, ["WINFUT_F_0", "ULT"]) get_new_values ​​= Истина результат = rtd_server.ConnectData(TopicID=topic_id, Strings=strings, GetNewValues=get_new_values) print("Результат:", результат) Connect_to_rtd_server('rtdtrading.rtdserver') Файл «», строка 2, в ConnectData Файл "C:\Users\brenoperucchi\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\LocalCache\local-packages\Python312\site-packages\win32com\client\dynamic.py", строка 366, в _ApplyTypes_ результат = self._oleobj_.InvokeTypes( ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Ошибка типа: объекты для SAFEARRAYS должны быть последовательностями (последовательностей) или объектом-буфером. Метод ConnectData в COM-объектах предназначен для установления соединения для получения данных, ожидая определенных типов аргументов. Требуется TopicID в виде целого числа для идентификации темы данных и POINTER для SAFEARRAY из Variant для указания данные или параметры, необходимые для соединения, а также POINTER на BOOL, указывающий, следует ли немедленно получать новые значения. Понимание этих требований имеет решающее значение для успешного взаимодействия с COM-объектами, использующими этот метод для операций с данными.

#Код на C#

Array themeUlt = новый объект[] {тикер, "ULT" }; результаты = _rtdServer.ConnectData(903, themeUlt, true); строка LastPrice = результаты.ToString() ?? «Недоступно»; режим отладки:

topicUlt = {object[2]} [0] WINFUT_F_0 [1] УЛЬТ Ошибка указывает на то, что метод ConnectData объекта COM ожидает, что второй аргумент будет указателем на SAFEARRAY в определенном формате. Предоставленный объект не соответствует этому требованию, что позволяет предположить, что он может быть неправильно отформатирован как последовательность (или последовательности), которую COM ожидает для SAFEARRAY. Это несоответствие часто возникает при переходе с C# на Python, поскольку прямые манипуляции с указателями и структурами памяти, такими как SAFEARRAY, могут существенно различаться в этих средах.

#UPDATE 2

Единственная документация по этому COM-компоненту, которой я располагаю, предоставлена ​​ComBrowse, как показано здесь:


Изображение


Другая ссылка на этот COM находится в проекте C#: https://github.com/hbschiller/Composite ... ml.cs#L184
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»