擅长:python、mysql、java
<p>问题似乎很简单,设备句柄是一个64位实体(指向void的typedef指针)。它能在Windows7中正常工作只是一种侥幸,因为手柄的上33位是正确的零。在</p>
<p>ctypes中所有函数的返回类型默认为32位<code>int</code>。现在在Windows10中,似乎设置了第32位(符号位),当强制为int的句柄被推到64位堆栈上进行函数调用时,会在某个地方产生符号扩展。结果地址设置了所有高位(0xFFFFFFFFA…),指向内核空间而不是用户空间。在</p>
<p>因此,也许您可以使用</p>
<pre><code>lib.ftrScanOpenDevice.restype = c_void_p
</code></pre>
<p>这并不是说您不应该为<em>所有</em>函数定义参数和返回类型-您应该这样做,否则它们将只遵循C语言的默认参数提升规则,并且可以工作。。。或者完全失败,这取决于函数的原型本身是否与默认参数提升兼容。例如,任何接受<em><code>float</code>s</em>作为参数的函数都不能在没有定义原型的情况下正确调用。在</p>