2015-06-23 150 views
0

我想調用一個COM方法,它需要一個字符串SafeArray作爲參考傳遞,然後用方法結果填充。這是VBA,它完美的作品代碼:在Python中創建字符串SAFEARRAY

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應該是「指針SafeArray字符串」。

這是我第一次嘗試:

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

確保您的python變量格式正確(長和字符串)。嘗試使用類似下面的東西來獲取變量類型的形狀:

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

爲了與你的程序,你應該先於Win32調用檢查變量類型更加靈活。