2012-02-17 2 views
1

Я пишу скрипт 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).

+0

Попробуйте исследовать «ServiceFoo» с браузером com (т. Е. 'Combrowse.py', обычно находящимся в каталоге' python_inst \ Lib \ site-packages \ win32com \ client'). –

+0

@barti_ddu, спасибо за наконечник колосниковой решетки. В любом месте аргумент имеет значение «Pointer SafeArray User Defined (Flags = 2)» (т. Е. Флаги не равны «1»). У меня проблема. Есть идеи? – user850498

+0

imho, похоже, что конструктор SafeArray принимает 2 аргумента. Вы пробовали просто создать список emty и передать его в качестве первого аргумента Obj.Function()? –

ответ

0

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

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

1

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

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

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

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

+0

Спасибо за идею. Я отредактировал в моем вопросе фрагмент кода C#. Есть ли у вас какие-либо идеи о том, как конвертировать в python? Я буду читать IronPython, но мне нужно сделать это в чистом питоне. – user850498

+0

Хорошо, у вас есть фрагмент C#. Как насчет вызова простого COM-объекта из Python (с помощью win32com, поскольку вы должны оставаться на Python)? Вызвать функцию, которая принимает целое число и возвращает квадрат этого целого. Затем начните работать с объектами, массивами и перечислениями, а остальное. – PaulMcG

+0

см. Мой последний комментарий к вопросу. еще раз спасибо. – user850498

Смежные вопросы