在python中将参数传递给COM对象

时间:2012-02-17 12:54:39

标签: python com win32com

我正在编写一个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 

据我所知,第一个参数是返回值,并在python中正常返回。最后三个参数是枚举类型(转换为数字),但在任何情况下都是可选的。 我知道我在“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

重价值不是太大,所以我真的不明白最后一个。

系统: Windows 7 64位。 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是枚举形成Obj it self。它们都转换为-1(一个int)。

2 个答案:

答案 0 :(得分:1)

如果您遇到困难的问题,请尝试做一些简单的事情,这可能会让您对困难问题有所了解。

听起来你正试图从Python调用一个你并不完全熟悉的COM API,并且API使用的数据类型比简单的字符串和整数更复杂。为什么不尝试用.Net语言(如C#或VB)编写一个简单的客户端,并了解库期望的值?在这些语言中甚至可能存在一些您可以复制和运行的示例。然后从一个工作示例中,您可以将其转换为Python。

你可能采取的另一种策略可能是使用IronPython,它已经.Net-aware / friendly,并且可能使你的开发更简单。

最后,另一个.Net友好的Pythonesque语言是Boo,我过去曾用它为客户端构建一些简单的实用程序,因为你可以编写与Python非常相似的代码,但是它构建为独立的.DLL或.EXE。虽然该项目在一年多的时间内没有任何明显的活动,但几年前我在开发一些SOAP客户端和服务器代码时,这种语言对我非常有用。

答案 1 :(得分:0)

在VB中编写,并在我的问题解密ByRef中使用ByRef Time As String,开关时,该函数会更改实际变量(如c ++中的指针)。

此COM对象尝试更改一些不允许更改的内存。这就是我在python中运行时出现内存错误的原因。