在99%的情况下,参数(和/或返回)之间的不一致是导致类型不一致的原因([SO]:Python ctypes cdll.LoadLibrary,实例化对象,执行其方法,私有变量地址被截断(@CristiFati的回答)是一个这样的例子)。
始终具有[Python 3.Docs]:ctypes-使用ctypes时,会打开Python的外部函数库。
我发现了[GitHub]:erikssm / futronics-fingerprint-reader-(主)futronics-fingerprint-reader / ftrScanAPI.h(我不知道它与您当前所拥有的有什么不同,但是到目前为止您发布的内容似乎很匹配),并且我对您的代码做了一些更改:
定义函数的argtypes和restype
定义缺失的类型(仅出于清晰目的)
其他一些无关紧要的更改(重命名)
我在上面的文件中注意到的另一件事是一个#pragma pack(push, 1)宏(有关更多详细信息,请参见[MS.Docs]:pack)。对于此结构,它没有任何区别(感谢@AnttiHaapala作为提示),因为3 int(4字节)成员的对齐方式没有变化,但是对于其他结构(成员类型为“较小”(例如char,short)),您可以可能要添加:_pack_ = 1
您修改后的代码(不用说,我没有运行它,因为我没有.dll):
from ctypes import wintypes
# ...
lib = ctypes.WinDLL('ftrScanAPI.dll') # provided by fingerprint scanner
class FTRSCAN_IMAGE_SIZE(ctypes.Structure):
# _pack_ = 1
_fields_ = [
("nWidth", ctypes.c_int),
("nHeight", ctypes.c_int),
("nImageSize", ctypes.c_int),
]
PFTRSCAN_IMAGE_SIZE = ctypes.POINTER(FTRSCAN_IMAGE_SIZE)
FTRHANDLE = ctypes.c_void_p
print('Open device and get device handle...')
lib.ftrScanOpenDevice.argtypes = []
lib.ftrScanOpenDevice.restype = FTRHANDLE
h_device = lib.ftrScanOpenDevice()
print('handle is', h_device)
print('Get image size...')
image_size = FTRSCAN_IMAGE_SIZE(0, 0, 0)
lib.ftrScanGetImageSize.argtypes = [FTRHANDLE, PFTRSCAN_IMAGE_SIZE]
lib.ftrScanGetImageSize.restype = wintypes.BOOL
if lib.ftrScanGetImageSize(h_device, ctypes.byref(image_size)):
print('Get image size succeed...')
print(' W', image_size.nWidth)
print(' H', image_size.nHeight)
print(' Size', image_size.nImageSize)
else:
print('Get image size failed...')