0

サーバーにメッセージを送信するcomクライアントを作成しようとしています。私はoleビューア定義を持っており、Pythonで構造(クラス)を作成しました。これは、より多くの構造と列挙型を持つ複雑な構造を構築するために使用されます。

すべてが順調に進んでいるようですが、SampleObject *をクライアント呼び出しに渡そうとすると、次のエラーが発生します。

ctypes.ArgumentError: argument 1: <type 'exceptions.TypeError'>:
expected LP__SampleObject instance instead of LP__SampleObject

これはかなり奇妙に思えます。私がしていることは次のようなものです(これは私がエラーを得るところです):

dialog = _SampleObject('hello', struct1, 'hi_there', struct2, 1, struct3, 1, 1, 1, 'me', 'you', 'him')
obj.COM_function( pointer(dialog) )

私は多くのことを試みましたが、そのエラーを回避することはできません。何か案は ?

(objは単なるcc.CreateObject()コクラスオブジェクトであり、問​​題なく機能します)

私は本当に問題を見ることができません、comtype定義でさえインターフェースにそれを表示します:

( ['in'], POINTER(_SampleObject), 'pAction' ),

これはpointer(dialog)と完全に一致します。これは非常に奇妙なエラーですが、comtypesである可能性がありますか?

4

1 に答える 1

2

ctypes引数の構造体と結合を複数回定義していますか?

StructureまたはUnionサブクラスを定義し、それargtypesをCライブラリ関数ので使用し、構造体または和集合を再定義してから、再定義されたクラスのインスタンスをC関数に渡そうとすると、現在と同様のエラーが発生します。見て。

この回答で使用したコードを使用して、使用されている構造の(完全に不要な)再定義を追加しました。(byref最後にpointer-を使用byrefすると、別のエラーメッセージが表示されます。)Pythonコードは次のようになりました。

from ctypes import *

class TestStruct(Structure):
    _fields_ = [("a", c_int),
                ("array", (c_float * 4) * 30)]

slib = CDLL("slib.dll")
slib.print_struct.argtypes = [POINTER(TestStruct)]
slib.print_struct.restype = None

# Redefine the ctypes structure.
class TestStruct(Structure):
    _fields_ = [("a", c_int),
                ("array", (c_float * 4) * 30)]

t = TestStruct()

for i in range(30):
    for j in range(4):
        t.array[i][j] = i + 0.1*j

slib.print_struct(pointer(t))

この変更されたスクリプトを実行すると、次の出力が得られました。

C:\Users\Luke\Python stuff>slib2.py
Traceback (most recent call last):
  File "C:\Users\Luke\Python stuff\slib2.py", line 21, in <module>
    slib.print_struct(pointer(t))
ctypes.ArgumentError: argument 1: <type 'exceptions.TypeError'>: expected LP_TestStruct instance instead of LP_TestStruct
于 2012-08-08T16:05:13.620 に答える