在 99%
的情况下,参数(和/或返回)类型不一致之间的不一致是导致这种情况的原因(检查[[SO]:通过ctypes从Python调用的C函数返回错误的)。
始终具有[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 scannerclass 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_pprint('Open device and get device handle...')lib.ftrScanOpenDevice.argtypes = []lib.ftrScanOpenDevice.restype = FTRHANDLEh_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.BOOLif 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...')


