python在不同系统代码区别_不同操作系统上的python ctypes问题

在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...')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值