0

我正在尝试调用一个 COM 方法,该方法需要将 SafeArray 的字符串作为引用传递,然后用方法结果填充该方法。这是 VBA 中的代码,可以完美运行:

dimr RC as New RAS41.HECRASController
RC.Project_Open "c:\myProj.prj"
dim numMessages as Long
dim messages() as String
RC.Compute_CurrentPlan( numMessages, messages())

现在,我正在尝试使用 win32com 模块对 Python 3.4 执行相同的操作。但是,我一直在尝试创建具有正确类型的第二个参数,根据combrowse.py 应该是“Pointer SafeArray String”。

这是我的第一次尝试:

import win32com
RC =  win32com.client.Dispatch("RAS41.HECRASController")
RC.Project_Open("c:\\myProj.prj")
numMessages = 0
messages = []
RC.Compute_CurrentPlan(numMessages, messages)

我也尝试将该变量构造为

messages = win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_BSTR, [])

但它也没有用。错误消息如下所示:

Traceback (most recent call last):
File "<pyshell#101>", line 1, in <module>
  print(o.Compute_CurrentPlan(1,b))
File "<COMObject RAS41.HECRASController>", line 3, in Compute_CurrentPlan
File "C:\Python34\lib\site-packages\win32com\client\dynamic.py", line 282, in _ApplyTypes_
result = self._oleobj_.InvokeTypes(*(dispid, LCID, wFlags, retType, argTypes) + args)
TypeError: Objects for SAFEARRAYS must be sequences (of sequences), or a buffer object.
4

1 回答 1

1

确保您的 python 变量格式正确(Long 和 String)。尝试使用类似下面的东西来获得变量类型的形状:

messages = ['']
RC.Compute_CurrentPlan(long(numMessages), messages)

为了使您的程序更加灵活,您应该在 win32 调用之前检查变量类型。

于 2015-12-15T15:30:55.050 回答