我试图调用一个需要将SafeArray of Strings作为引用传递的COM方法,然后用方法结果填充它。这是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.
答案 0 :(得分:0)
确保python变量的格式正确(Long和String)。尝试使用类似下面的内容来获取形状中的变量类型:
messages = ['']
RC.Compute_CurrentPlan(long(numMessages), messages)
为了更灵活地使用您的程序,您应该在win32调用之前检查变量类型。