【问题标题】:Create SAFEARRAY of Strings in Python在 Python 中创建字符串的 SAFEARRAY
【发布时间】:2015-12-15 23:30:55
【问题描述】:

我正在尝试调用一个 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())

现在,我正在尝试从 Python 3.4 开始,使用 win32com 模块来做同样的事情。但是,我一直在尝试创建具有正确类型的第二个参数,根据 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


    【解决方案1】:

    确保您的 Python 变量格式正确(Long 和 String)。尝试使用类似以下的方法来获取变量类型:

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

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

    【讨论】:

      猜你喜欢
      • 2018-07-27
      • 1970-01-01
      • 1970-01-01
      • 2019-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-14
      相关资源
      最近更新 更多