<p>{<or-example}中的不一致(例如,^/em)是参数之间的不一致。在</p>
<p>使用<em>ctypes</em>时,始终打开<a href="https://docs.python.org/3/library/ctypes.html" rel="nofollow noreferrer">[Python 3.Docs]: ctypes - A foreign function library for Python</a>。在</p>
<p>我找到了<a href="https://github.com/erikssm/futronics-fingerprint-reader/blob/master/ftrScanAPI.h" rel="nofollow noreferrer">[GitHub]: erikssm/futronics-fingerprint-reader - (master) futronics-fingerprint-reader/ftrScanAPI.h</a>(我不知道它与您当前拥有的有多大不同,但是您目前发布的内容似乎匹配),我对您的代码做了一些更改:</p>
<ul>
<li><strong>为函数定义<em>argtypes</em>和<em>restype</em></li>
<li>定义缺失类型(仅为清晰起见)</li>
<li>其他一些不重要的更改(重命名)</li>
<li>在上面的文件中,我还注意到了一个<code>#pragma pack(push, 1)</code>宏(查看<a href="https://docs.microsoft.com/en-us/cpp/preprocessor/pack" rel="nofollow noreferrer">[MS.Docs]: pack</a>获取更多详细信息)。对于这个结构,它没有什么区别(感谢@AnttiHaapala的提示),因为3<em>int</em>(<em>4</em>字节)成员对齐方式没有改变,但是对于其他结构(具有“更小”成员类型(例如<em>char</em>,<em>short</em>)您可能需要添加:<code>_pack_ = 1</code></li>
</ul>
<p>你修改过的代码(不用说,我没有运行它,因为我没有<em>.dll</em>):</p>
<pre class="lang-py prettyprint-override"><code>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...')
</code></pre>