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() coclass 对象,可以正常工作)

我真的看不出问题,即使是comtype定义也在界面中显示:

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

与指针(对话框)完美契合。这是一个非常奇怪的错误,它可能是一个 but on comtypes 吗?

4

1 回答 1

2

ctypes您是否不止一次地定义了论点的结构和联合?

如果您定义一个StructureUnion子类,在 C 库函数中使用它argtypes,重新定义结构或联合,然后尝试将重新定义的类的实例传递给 C 函数,您将收到类似于您的错误看到。

我采用了我在这个答案中使用的代码,并添加了一个(完全没有必要的)重新定义与它一起使用的结构。(我还将byref最后的pointer- usingbyref给你一个不同的错误消息。)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 回答