Fixes for 64-bit Windows: In ctypes.wintypes, correct the definitions

of HANDLE, WPARAM, LPARAM data types.  Make parameterless foreign
function calls work.
This commit is contained in:
Thomas Heller 2007-01-11 21:18:56 +00:00
parent 9fdfadb06e
commit 8138c26a83
4 changed files with 36 additions and 6 deletions

View File

@ -3,6 +3,7 @@
from ctypes import * from ctypes import *
from ctypes.test import is_resource_enabled from ctypes.test import is_resource_enabled
import unittest, sys import unittest, sys
from ctypes import wintypes
import _ctypes_test import _ctypes_test
@ -32,12 +33,30 @@ if sys.platform == "win32" and sizeof(c_void_p) == sizeof(c_int):
# or wrong calling convention # or wrong calling convention
self.assertRaises(ValueError, IsWindow, None) self.assertRaises(ValueError, IsWindow, None)
if sys.platform == "win32":
class FunctionCallTestCase(unittest.TestCase):
if is_resource_enabled("SEH"): if is_resource_enabled("SEH"):
def test_SEH(self): def test_SEH(self):
# Call functions with invalid arguments, and make sure that access violations # Call functions with invalid arguments, and make sure
# are trapped and raise an exception. # that access violations are trapped and raise an
# exception.
self.assertRaises(WindowsError, windll.kernel32.GetModuleHandleA, 32) 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): class Structures(unittest.TestCase):
def test_struct_by_value(self): def test_struct_by_value(self):

View File

@ -34,8 +34,14 @@ LPCOLESTR = LPOLESTR = OLESTR = c_wchar_p
LPCWSTR = LPWSTR = c_wchar_p LPCWSTR = LPWSTR = c_wchar_p
LPCSTR = LPSTR = c_char_p LPCSTR = LPSTR = c_char_p
WPARAM = c_uint # WPARAM is defined as UINT_PTR (which is signed)
LPARAM = c_long # 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 ATOM = WORD
LANGID = WORD LANGID = WORD
@ -48,7 +54,7 @@ LCID = DWORD
################################################################ ################################################################
# HANDLE types # HANDLE types
HANDLE = c_ulong # in the header files: void * HANDLE = c_void_p # in the header files: void *
HACCEL = HANDLE HACCEL = HANDLE
HBITMAP = HANDLE HBITMAP = HANDLE

View File

@ -109,6 +109,10 @@ Core and builtins
Library 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". - The version number of the ctypes package changed to "1.1.0".
- Bug #1627575: logging: Added _open() method to FileHandler which can - Bug #1627575: logging: Added _open() method to FileHandler which can

View File

@ -224,7 +224,8 @@ ffi_call(/*@dependent@*/ ffi_cif *cif,
#else #else
case FFI_SYSV: case FFI_SYSV:
/*@-usedef@*/ /*@-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); cif->flags, ecif.rvalue, fn);
/*@=usedef@*/ /*@=usedef@*/
break; break;