diff options
author | Thomas Heller <theller@ctypes.org> | 2007-01-11 21:18:56 (GMT) |
---|---|---|
committer | Thomas Heller <theller@ctypes.org> | 2007-01-11 21:18:56 (GMT) |
commit | 8138c26a8306a423ab0ae2c45976a37a2c000de6 (patch) | |
tree | f1bca12ced26b54897e90c9f1d1959bee94d4f9f | |
parent | 9fdfadb06ee3c6d182af084afaa97bc6bf4652bc (diff) | |
download | cpython-8138c26a8306a423ab0ae2c45976a37a2c000de6.zip cpython-8138c26a8306a423ab0ae2c45976a37a2c000de6.tar.gz cpython-8138c26a8306a423ab0ae2c45976a37a2c000de6.tar.bz2 |
Fixes for 64-bit Windows: In ctypes.wintypes, correct the definitions
of HANDLE, WPARAM, LPARAM data types. Make parameterless foreign
function calls work.
-rw-r--r-- | Lib/ctypes/test/test_win32.py | 23 | ||||
-rw-r--r-- | Lib/ctypes/wintypes.py | 12 | ||||
-rw-r--r-- | Misc/NEWS | 4 | ||||
-rw-r--r-- | Modules/_ctypes/libffi_msvc/ffi.c | 3 |
4 files changed, 36 insertions, 6 deletions
diff --git a/Lib/ctypes/test/test_win32.py b/Lib/ctypes/test/test_win32.py index 10deaca..d6f018b 100644 --- a/Lib/ctypes/test/test_win32.py +++ b/Lib/ctypes/test/test_win32.py @@ -3,6 +3,7 @@ from ctypes import * from ctypes.test import is_resource_enabled import unittest, sys +from ctypes import wintypes import _ctypes_test @@ -32,12 +33,30 @@ if sys.platform == "win32" and sizeof(c_void_p) == sizeof(c_int): # or wrong calling convention self.assertRaises(ValueError, IsWindow, None) +if sys.platform == "win32": + class FunctionCallTestCase(unittest.TestCase): + if is_resource_enabled("SEH"): def test_SEH(self): - # Call functions with invalid arguments, and make sure that access violations - # are trapped and raise an exception. + # Call functions with invalid arguments, and make sure + # that access violations are trapped and raise an + # exception. self.assertRaises(WindowsError, windll.kernel32.GetModuleHandleA, 32) + def test_noargs(self): + # This is a special case on win32 x64 + windll.user32.GetDesktopWindow() + + class TestWintypes(unittest.TestCase): + def test_HWND(self): + self.failUnlessEqual(sizeof(wintypes.HWND), sizeof(c_void_p)) + + def test_PARAM(self): + self.failUnlessEqual(sizeof(wintypes.WPARAM), + sizeof(c_void_p)) + self.failUnlessEqual(sizeof(wintypes.LPARAM), + sizeof(c_void_p)) + class Structures(unittest.TestCase): def test_struct_by_value(self): diff --git a/Lib/ctypes/wintypes.py b/Lib/ctypes/wintypes.py index 9768233..d2c1e38 100644 --- a/Lib/ctypes/wintypes.py +++ b/Lib/ctypes/wintypes.py @@ -34,8 +34,14 @@ LPCOLESTR = LPOLESTR = OLESTR = c_wchar_p LPCWSTR = LPWSTR = c_wchar_p LPCSTR = LPSTR = c_char_p -WPARAM = c_uint -LPARAM = c_long +# WPARAM is defined as UINT_PTR (which is signed) +# LPARAM is defined as LONG_PTR (which is unsigned) +if sizeof(c_long) == sizeof(c_void_p): + WPARAM = c_ulong + LPARAM = c_long +elif sizeof(c_longlong) == sizeof(c_void_p): + WPARAM = c_ulonglong + LPARAM = c_longlong ATOM = WORD LANGID = WORD @@ -48,7 +54,7 @@ LCID = DWORD ################################################################ # HANDLE types -HANDLE = c_ulong # in the header files: void * +HANDLE = c_void_p # in the header files: void * HACCEL = HANDLE HBITMAP = HANDLE @@ -109,6 +109,10 @@ Core and builtins Library ------- +- Fixes for 64-bit Windows: In ctypes.wintypes, correct the + definitions of HANDLE, WPARAM, LPARAM data types. Make + parameterless foreign function calls work. + - The version number of the ctypes package changed to "1.1.0". - Bug #1627575: logging: Added _open() method to FileHandler which can diff --git a/Modules/_ctypes/libffi_msvc/ffi.c b/Modules/_ctypes/libffi_msvc/ffi.c index 3f23a05..e3e2344 100644 --- a/Modules/_ctypes/libffi_msvc/ffi.c +++ b/Modules/_ctypes/libffi_msvc/ffi.c @@ -224,7 +224,8 @@ ffi_call(/*@dependent@*/ ffi_cif *cif, #else case FFI_SYSV: /*@-usedef@*/ - return ffi_call_AMD64(ffi_prep_args, &ecif, cif->bytes, + /* Function call needs at least 40 bytes stack size, on win64 AMD64 */ + return ffi_call_AMD64(ffi_prep_args, &ecif, cif->bytes ? cif->bytes : 40, cif->flags, ecif.rvalue, fn); /*@=usedef@*/ break; |