为什么Python 2.7签名扩展了从x64上的GetDC()返回的HDC?

时间:2014-02-10 19:39:03

标签: python 64-bit windows-7-x64 cython

在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似乎解决了这个问题。

1 个答案:

答案 0 :(得分:1)

ctypes假定函数返回signed int,除非你另有说明。将函数 restype 设置为无符号值:

from ctypes import *
windll.user32.GetDC.restype = c_void_p
hDC1 = windll.user32.GetDC(None)

ctypes对参数和返回值一无所知,只是函数的入口点。需要猜测,但允许您使用 argtypes restype 覆盖。