我正在尝试调用一个 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.
确保 Python 变量的格式正确(长整型和字符串)。尝试使用类似以下内容来获取形状中的变量类型:
messages = ['']
RC.Compute_CurrentPlan(long(numMessages), messages)
为了使您的程序更加灵活,您应该在 win32 调用之前检查变量类型。
我意识到这是一个老问题,但我遇到了这个问题并想分享解决方案。我在定义前两个参数的数据类型时遇到问题,但只需将它们设置为 None 即可,并且会报告消息和计算消息的数量(我通过分配 text = hec.Compute_CurrentPlan(None, None, True) 和然后打印(测试))。第三个参数是阻塞模式,设置为 True,这意味着 RAS 计算将在移至下一行代码之前完成。我正在使用 Python 3.10.4 和 HEC-RAS 版本 6.3。
import win32com.client
hec = win32com.client.Dispatch('RAS630.HECRASController')
hec.Project_Open(r"C:\myproj.prj")
hec.ShowRAS()
hec.Compute_CurrentPlan(None, None, True)
hec.QuitRAS()