在 Python 中创建字符串的 SAFEARRAY

问题描述 投票:0回答:2

我正在尝试调用一个 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 vba win32com safearray hec-ras
2个回答
1
投票

确保 Python 变量的格式正确(长整型和字符串)。尝试使用类似以下内容来获取形状中的变量类型:

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

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


0
投票

我意识到这是一个老问题,但我遇到了这个问题并想分享解决方案。我在定义前两个参数的数据类型时遇到问题,但只需将它们设置为 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()
© www.soinside.com 2019 - 2024. All rights reserved.