2012-02-17 33 views
1

私は、Comオブジェクトを制御するPythonスクリプトを作成しています。公式ドキュメントは、C#である次のように、VBとC (VBで)ドキュメントは次のとおりです。PythonのCOMオブジェクトに引数を渡します。

Public Function GetDATA { 
ByVal vecRecords() As DATAType, 
ByRef Time As String, 
optional ByVal filter1 As String, 
optional ByVal kind2 As Kind = KindAll, 
optional ByVal type1 As Types = TypeAll 
) As Long 

私の知る限り、第一引数には、戻り値であり、Pythonで通常通りに返されます。最後の3つの引数は列挙型(数値に変換されます)ですが、いずれの場合でもオプションです。 "ByRef Time As String"でどのような引数を渡すのですか?

私のコードは次のとおりです。

>>> from win32com.client import Dispatch 
>>> Obj = Dispatch("Service.Foo") 
>>> Obj.Function() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "D:\Python27\lib\site-packages\win32com\gen_py\48C77DB1-D9E0-45B8-9992-C9 
2B047CC700x0x1x0.py", line 399, in Function 
    , LastTime, BNO, kind, madadType) 
    File "D:\Python27\lib\site-packages\win32com\client\__init__.py", line 456, in 
_ApplyTypes_ 
    self._oleobj_.InvokeTypes(dispid, 0, wFlags, retType, argTypes, *args), 
pywintypes.com_error: (-2147023170, 'The remote procedure call failed.', None, None) 

私も走っ:

>>> Obj.Function() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "D:\Python27\lib\site-packages\win32com\gen_py\48C77DB1-D9E0-45B8-9992-C9 
2B047CC700x0x1x0.py", line 399, in Function 
    , LastTime, BNO, kind, madadType) 
    File "D:\Python27\lib\site-packages\win32com\client\__init__.py", line 456, in 
_ApplyTypes_ 
    self._oleobj_.InvokeTypes(dispid, 0, wFlags, retType, argTypes, *args), 
TypeError: Objects for SAFEARRAYS must be sequences (of sequences), or a bufferobject. 

と:

>>> a= ("00000000","00000000",-1,-1) 
>>> Obj.Function(a) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "D:\Python27\lib\site-packages\win32com\gen_py\48C77DB1-D9E0-45B8-9992-C9 
2B047CC700x0x1x0.py", line 399, in Function 
    , LastTime, BNO, kind, madadType) 
    File "D:\Python27\lib\site-packages\win32com\client\__init__.py", line 456, in 
_ApplyTypes_ 
    self._oleobj_.InvokeTypes(dispid, 0, wFlags, retType, argTypes, *args), 
MemoryError: CreatingSafeArray 

をretvalueが大きすぎないので、私は本当に最後のを理解していません1。

システム: windows 7 64bit。 python 2.7.2 32ビット(cmdから実行して、管理者として起動しました.COMオブジェクトに必要です)

機能が何を求めているかを簡単に調べる方法はありますか?

ありがとうございます Marbs。

[編集] は、私はあなたに取り組んでC#コードスニペットを与える:Obj.type1とObj.type2が列挙されている

System.Array tempArray; 
string lTime = "00000000"; 
Res = Obj.getDATA(out tempArray, ref lTime, "0", Obj.type1, Obj.type2); 

がobjのその自己を形成します。両方とも-1(int)に変換されます。

+0

comブラウザ(「python_inst \ Lib \ site-packages \ win32com \ client'ディレクトリに通常あるcombrowse.py」)で「ServiceFoo」を探索してみてください。 –

+0

@barti_ddu、火格子のチップありがとう。引数が "Pointer SafeArray User Defined(Flags = 2)"(つまり、フラグが "1"に等しくない)のような場所であれば問題はあります。何か案は? – user850498

+0

imho、それはSafeArrayコンストラクタが2つの引数を取るように見えます。 emtyリストを作成し、Obj.Function()の最初の引数として渡してみましたか? –

答えて

0

私の質問からByRef Time As String,のようにByRefスイッチを使用してVBで記述すると、この関数は実際の変数(C++のポインタのような)を変更します。

このCOMオブジェクトは、変更できないメモリを変更しようとしました。そのため、Pythonで実行するとメモリエラーが発生します。

1

難しい問題がある場合は、難しい問題のいくつかの洞察を与えるかもしれない簡単なことをやってみてください。

Pythonから完全に慣れていないCOM APIを呼び出そうとしているようで、APIは単純な文字列や整数よりも複雑なデータ型を使用しているようです。 C#やVBのような.Net言語でシンプルなクライアントを作成し、ライブラリが期待する値を知りたいのですがこれらの言語では、コピーして実行できるいくつかの例があります。次に、実際の例から、それをPythonに変換することができます。

IronPythonを使用することもできます。IronPythonは既に.NET対応であり、開発を簡単にすることができます。

最後にもう1つ、Pythonに似たコードを書くことができるので、私はこれまでクライアントで簡単なユーティリティを構築していたBooです。自立しています.DLLまたは.EXE。このプロジェクトは1年以上の間に明らかな活動をしていませんでしたが、数年前にSOAPクライアントとサーバーコードを開発していたとき、この言語はとても役に立ちました。

+0

アイデアありがとう。私は自分の質問にC#コードスニペットを編集しました。あなたはどのようにPythonに変換するための任意の洞察力を持っていますか?私はIronPythonで読むが、私は純粋なpythonでこれを行う必要があります。 – user850498

+0

さて、あなたはC#スニペットを持っています。 Pythonから単純なCOMオブジェクトを呼び出す方法はありますか?(あなたはPythonにとどまらなければならないので、win32comを使用しています)整数をとり、その整数の2乗を返す関数を呼び出します。その後、オブジェクトと配列、列挙子、そして残りの部分に取り掛かります。 – PaulMcG

+0

質問への最後のコメントを参照してください。再度、感謝します。 – user850498

関連する問題