передача аргументов в COM-объект в Python - PullRequest
1 голос
/ 17 февраля 2012

Я пишу скрипт на python для управления объектом Com.Официальная документация находится на C #, VB и C. Документация (на VB) выглядит следующим образом:

Public Function GetDATA { 
ByVal vecRecords() As DATAType,
ByRef Time As String, 
optional ByVal filter1 As String, 
optional ByVal kind2 As Kind = KindAll, 
optional ByVal type1 As Types = TypeAll 
) As Long 

Насколько я могу судить, 1-й аргумент является возвращаемым значением и возвращается как обычно впитон.Последние три аргумента являются типами enum (переведены в числа), но в любом случае являются необязательными.У меня остался вопрос, какой аргумент я передаю в «ByRef Time As String»?

мой код:

>>> from win32com.client import Dispatch
>>> Obj = Dispatch("Service.Foo")
>>> Obj.Function()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "D:\Python27\lib\site-packages\win32com\gen_py\48C77DB1-D9E0-45B8-9992-C9
2B047CC700x0x1x0.py", line 399, in Function 
    , LastTime, BNO, kind, madadType)
  File "D:\Python27\lib\site-packages\win32com\client\__init__.py", line 456, in
 _ApplyTypes_
    self._oleobj_.InvokeTypes(dispid, 0, wFlags, retType, argTypes, *args),
pywintypes.com_error: (-2147023170, 'The remote procedure call failed.', None, None)

Я также выполнил:

>>> Obj.Function()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "D:\Python27\lib\site-packages\win32com\gen_py\48C77DB1-D9E0-45B8-9992-C9
2B047CC700x0x1x0.py", line 399, in Function 
    , LastTime, BNO, kind, madadType)
  File "D:\Python27\lib\site-packages\win32com\client\__init__.py", line 456, in
 _ApplyTypes_
     self._oleobj_.InvokeTypes(dispid, 0, wFlags, retType, argTypes, *args),
 TypeError: Objects for SAFEARRAYS must be sequences (of sequences), or a bufferobject.

и:

>>> a= ("00000000","00000000",-1,-1)
>>> Obj.Function(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "D:\Python27\lib\site-packages\win32com\gen_py\48C77DB1-D9E0-45B8-9992-C9
2B047CC700x0x1x0.py", line 399, in Function 
    , LastTime, BNO, kind, madadType)
  File "D:\Python27\lib\site-packages\win32com\client\__init__.py", line 456, in
 _ApplyTypes_
     self._oleobj_.InvokeTypes(dispid, 0, wFlags, retType, argTypes, *args),
MemoryError: CreatingSafeArray

Retvalue не слишком велик, поэтому я действительно не понимаю последнее.

system: windows 7 64bit.python 2.7.2 32-битный (запускается из cmd, запущенного от имени администратора, COM-объект нуждается в этом.)

Есть ли простой способ узнать, чего хочет функция?

Заранее спасибо Marbs.

[Редактировать] Я даю вам рабочий фрагмент кода C #:

System.Array tempArray;
string lTime = "00000000";
Res = Obj.getDATA(out tempArray, ref lTime, "0", Obj.type1, Obj.type2);  

Где Obj.type1 и Obj.type2 являются перечислениями изОбъ это сам.Они оба переводят в -1 (целое число).

Ответы [ 2 ]

1 голос
/ 17 февраля 2012

Если у вас возникли проблемы с чем-то сложным, попробуйте сделать что-то легкое, что может дать вам некоторое представление о сложной проблеме.

Звучит так, как будто вы пытаетесь вызвать API-интерфейс COM, с которым вы не совсем знакомы, из Python и что API использует типы данных, которые являются более сложными, чем простые строки и целые числа.Почему бы не попробовать написать простой клиент на языке .Net, например C # или VB, и не получить представление о том, каких ценностей ожидает библиотека?На тех языках могут быть даже некоторые примеры, которые вы можете просто скопировать и запустить.Затем из рабочего примера вы можете преобразовать его в Python.

Еще один способ, которым вы могли бы воспользоваться, - это использовать IronPython, который уже является .Net-осведомленным / дружественным и может упростить вашу разработку.

И, наконец, еще один Python-язык, дружественный к .Net, - Boo , который я использовал в прошлом для создания простых утилит для клиентов, поскольку вы можете писать код, очень похожий на Python., но который строит для автономных .DLLs или .EXEs.Хотя этот проект не проявлял какой-либо очевидной активности более года, этот язык был очень полезен для меня, когда я несколько лет назад разрабатывал некоторый клиентский и серверный код SOAP.

0 голосов
/ 03 июля 2012

При записи в VB и использовании переключателя ByRef, как в расшифровке ByRef Time As String, из моего вопроса, функция изменяет фактическую переменную (как указатель в c ++).

Этот COM-объект попытался изменить часть памяти, которую не было разрешено изменить. Вот почему я получил ошибку памяти при запуске в Python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...