Не удается передать аргументы объекту ActiveX COM с помощью PyQt4

Я пытаюсь написать код Python, чтобы поговорить с элементом управления Thrlabs APT ActiveX. Я основываю свой код на коде, найденном на этой странице , но пытаюсь использовать контейнер PyQt4 ActiveX вместо контейнера ActiveX wxPython. Он работает для очень простых методов ActiveX, однако я получаю сообщение об ошибке при попытке вызвать метод, который принимает аргументы.

Этот код работает и показывает окно для Thorlabs APT:

  • Что вы можете делать с COM / ActiveX в Python?
  • Как создать скрипт OLE-компонента с помощью Python?
  • import sys from ctypes import * from PyQt4 import QtGui from PyQt4 import QAxContainer class APTSystem(QAxContainer.QAxWidget): def __init__(self, parent): self.parent = parent super(APTSystem, self).__init__() self.setControl('{B74DB4BA-8C1E-4570-906E-FF65698D632E}') # calling this method works self.AboutBox() app = QtGui.QApplication(sys.argv) a = APTSystem(app) 

    Когда я заменяю self.AboutBox() методом с аргументами, например:

     num_units = c_int() self.GetNumHWUnitsEx(21, byref(num_units)) 

    Я получаю сообщение об ошибке: TypeError: unable to convert argument 1 of APTSystem.GetNumHWUnitsEx from 'CArgObject' to 'int&'

    Я предполагаю, что тип аргумента должен быть типом ctypes. Есть ли какая-то магия ctypes, которая может решить эту проблему?

  • «Не реализовано» Исключение при использовании pywin32 для управления Adobe Acrobat
  • Доступ к незарегистрированным COM-объектам из python через зарегистрированный TLB
  • Можно ли использовать Win32 COM для замены текста внутри документа Word?
  • Доступ к данным в Excel - Reuter из python
  • Как создать скрипт OLE-компонента с помощью Python?
  • Что вы можете делать с COM / ActiveX в Python?
  • One Solution collect form web for “Не удается передать аргументы объекту ActiveX COM с помощью PyQt4”

    Оказывается, у меня был синтаксис совершенно неправильный, он работал с помощью функции generateDocumentation() как упоминалось здесь , и некоторые параметры помогают здесь . Рабочий код выглядит так:

     import sys from PyQt4 import QtGui from PyQt4 import QAxContainer from PyQt4.QtCore import QVariant class APTSystem(QAxContainer.QAxWidget): def __init__(self, parent): super(APTSystem, self).__init__() # connect to control self.setControl('{B74DB4BA-8C1E-4570-906E-FF65698D632E}') # required by device self.dynamicCall('StartCtrl()') # args must be list of QVariants typ = QVariant(6) num = QVariant(0) args = [typ, num] self.dynamicCall('GetNumHWUnits(int, int&)', args) # only list items are updated, not the original ints! if args[1].toInt()[1]: print 'Num of HW units =', args[1].toInt()[0] self.dynamicCall('StopCtrl()') app = QtGui.QApplication(sys.argv) a = APTSystem(app) 

    Второй элемент в списке args содержит правильное значение, но num никогда не обновляется вызовом.

    Python - лучший язык программирования в мире.