我正在尝试创建一个com客户端来向服务器发送消息。我有ole viewer定义并在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' ),
完全适合指针(对话框)。这是一个非常奇怪的错误,可能是一个但是在comtypes上吗?
答案 0 :(得分:2)
您是否多次定义参数的ctypes
结构和联合?
如果定义Structure
或Union
子类,请在C库函数的argtypes
中使用它,重新定义结构或联合,然后尝试传递重新定义的实例C类函数的类,你会得到一个类似于你所看到的错误。
我使用了this answer中使用的代码,并添加了(完全不必要的)重新定义与其一起使用的结构。 (我还将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