2014-02-10 68 views
2

關於Python 2.7.5(默認,2013年5月15日,22:44:16)[MSC v.1500 64位(AMD64)]爲什麼返回值爲GetDC()符號擴展?爲什麼Python 2.7符號擴展從x64上的GetDC()返回的HDC?

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(返回)總是適合32位(甚至64)內,但用Cython似乎延長後者是籤如果設置了32位值的最高位(大約50%的時間),則GetDC()返回值。之後,嘗試使用此負值HANDLE在隨後的GDI調用中失敗。

這似乎是這樣一個重大問題,我不明白我失蹤了。

編輯

這個職位似乎得到了問題的根源:Why does setting ctypes dll.function.restype=c_void_p return long?

在我們的情況下,添加:

class c_void_p(c_void_p): 
pass 

的模塊,其中restype的開始是爲每個GDI庫函數定義的,似乎已經解決了這個問題。

回答

1

ctypes假定一個函數返回一個帶符號的int,除非你另有告知。功能restype設置爲一個無符號值:

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

的ctypes不知道參數和返回值,僅僅是函數的入口點什麼。這需要猜測,但可以讓你用argtypesrestype覆蓋。在用Cython

+0

,我們發現 HANDLE = ctypes.c_void_p HDC = HANDLE 但Pyglet實現的GetDC(),這是在 pyglet /庫/ win32的/ __init__.py _user32.GetDC.restype = HDC _user32.GetDC.argtypes = [HWND] 那麼,這是誰的錯誤? –

+0

啊,是的,自從我使用了句柄(Microsoft將它們定義爲PVOID)已經太久了。我嘗試過'c_void_p',它對我有效,所以我會改變答案。 pyglet的定義也應該起作用。你在pyglet初始化restype之前使用GetDC嗎? – tdelaney

+0

在Microsoft數據類型世界中,HANDLE是PVOID,HDC和HWND都是HANDLES。 pyglet的定義看起來是正確的(HWND進來了,HDC出來了)。 – tdelaney

相關問題