在Python 2.7.5上(默认,2013年5月15日,22:44:16)[MSC v.1500 64 bit(AMD64)]为什么 GetDC()符号的返回值已扩展?
from ctypes import *
hDC1 = windll.user32.GetDC(None)
print hex(hDC1), hDC1, type(hDC1)
hDC2 = windll.user32.GetDC(None)
print hex(hDC2), hDC2, type(hDC2)
有时会导致负回报值:
0x6a0116c1 1778456257 <type 'int'> # OK
-0x53fed994 -1409210772 <type 'int'> # Why negative?
我相信GetDC()返回的HANDLES总是在32位内(甚至在x64上),但是如果设置了32位值中的最高位,则cython似乎是扩展后者GetDC()返回值的符号(约50%)的时间)。之后,尝试使用此负值HANDLE在后续GDI调用中失败。
这似乎是一个重大问题,我无法理解我所缺少的东西。
修改:
这篇文章似乎找到了问题的根源:Why does setting ctypes dll.function.restype=c_void_p return long?
在我们的案例中,添加:
class c_void_p(c_void_p):
pass
到模块的开头,为每个GDI库函数定义了restype似乎解决了这个问题。
答案 0 :(得分:1)
ctypes假定函数返回signed int,除非你另有说明。将函数 restype 设置为无符号值:
from ctypes import *
windll.user32.GetDC.restype = c_void_p
hDC1 = windll.user32.GetDC(None)
ctypes对参数和返回值一无所知,只是函数的入口点。需要猜测,但允许您使用 argtypes 和 restype 覆盖。