我目前正在开发一个需要访问DLL中的函数的项目,我找到了ctypes来处理函数调用。但是,当某些函数要求通过引用传递参数时遇到一些困难。我已经尝试了ctypes.by_ref()但它不起作用,因为该对象是用户定义的类。
然后我尝试了ctypes.pointer()并且它会发出错误消息:" type 必须有存储信息"。我想这意味着它只需要ctypes数据类型?
我的代码:
from ctypes import *
class myclass():
a= None # requiring c_int32
b= None # requiring c_int32
myci= myclass()
myci.a= c_int32(255)
myci.b= c_int32(0)
mycip= pointer(myci) # let's say it's Line 8 here
loadso= cdll.LoadLibrary(mydll)
Result= loadso.thefunction (mycip) # int thefunction(ref myclass)
终端输出:
Line 8: TypeError: _type_ must have storage info
我想知道1)该错误消息是什么意思? 2)通过引用外部DLL来解决和传递用户定义类的方法。
提前感谢您的时间。
答案 0 :(得分:2)
错误消息表示您无法创建指向非ctypes类型的ctypes
指针。 ctypes
类型具有将值正确编组到C所需的信息。
阅读ctypes: Structures and Unions。第一句话是(强调我的):
结构和联合必须来自
ctypes
模块中定义的Structure和Union基类。
例如:
>>> from ctypes import *
>>> class Test(Structure):
... _fields_ = [('a',c_int32),
... ('b',c_int16),
... ('c',c_int16)]
...
>>> t = Test(1,2,3)
>>> pointer(t)
<__main__.LP_Test object at 0x00000234A8750A48>
>>> bytes(t)
b'\x01\x00\x00\x00\x02\x00\x03\x00'
请注意,可以获取指针,并且可以显示结构的原始字节。该结构是little-endian,为c_int32
分配了四个字节,两个c_int16
成员分别有两个字节。