Я пишу скрипт python для управления объектом Com. Официальная документация находится в C#, VB и C. документации (в VB) выглядит следующим образом:Передача аргументов объекту COM в python
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
Насколько я могу судить, первый аргументом является возвращаемым значением и возвращается в нормальном в питоне , Последние три аргумента - это перечисляемые типы (переводимые в числа), но в любом случае они являются необязательными. Я оставил вопрос о том, какой аргумент я передаю в «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# код Snippet:
System.Array tempArray;
string lTime = "00000000";
Res = Obj.getDATA(out tempArray, ref lTime, "0", Obj.type1, Obj.type2);
Где Obj.type1 и Obj.type2 являются перечислениями формирует это сам Obj. Оба они переводят в -1 (int).
Попробуйте исследовать «ServiceFoo» с браузером com (т. Е. 'Combrowse.py', обычно находящимся в каталоге' python_inst \ Lib \ site-packages \ win32com \ client'). –
@barti_ddu, спасибо за наконечник колосниковой решетки. В любом месте аргумент имеет значение «Pointer SafeArray User Defined (Flags = 2)» (т. Е. Флаги не равны «1»). У меня проблема. Есть идеи? – user850498
imho, похоже, что конструктор SafeArray принимает 2 аргумента. Вы пробовали просто создать список emty и передать его в качестве первого аргумента Obj.Function()? –