[pywin32-checkins] /hgrepo/p/py/pywin32/pywin32: more 64bit fixes
OLD project page for the Python extensions for Windows
Brought to you by:
mhammond
From: <pyw...@li...> - 2011-10-22 07:08:56
|
changeset bda8b9f07486 in /hgrepo/p/py/pywin32/pywin32 details: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/hgrepo/p/py/pywin32/pywin32?cmd=changeset;node=bda8b9f07486 summary: more 64bit fixes diffstat: win32/Lib/win32gui_struct.py | 34 +++++++++++++++++++++++++++------- 1 files changed, 27 insertions(+), 7 deletions(-) diffs (90 lines): diff -r 8ef9f05f12af -r bda8b9f07486 win32/Lib/win32gui_struct.py --- a/win32/Lib/win32gui_struct.py Thu Oct 13 11:42:49 2011 +1100 +++ b/win32/Lib/win32gui_struct.py Sat Oct 22 18:08:01 2011 +1100 @@ -48,6 +48,14 @@ def _MakeResult(names_str, values): return values +_nmhdr_fmt = "PPi" +if is64bit: + # When the item past the NMHDR gets aligned (eg, when it is a struct) + # we need this many bytes padding. + _nmhdr_align_padding = "xxxx" +else: + _nmhdr_align_padding = "" + # Encode a string suitable for passing in a win32gui related structure # If win32gui is built with UNICODE defined (ie, py3k), then functions # like InsertMenuItem are actually calling InsertMenuItemW etc, so all @@ -91,12 +99,13 @@ return _MakeResult("WMNOTIFY hwndFrom idFrom code", struct.unpack(format, buf)) def UnpackNMITEMACTIVATE(lparam): + format = _nmhdr_fmt + _nmhdr_align_padding if is64bit: # the struct module doesn't handle this correctly as some of the items # are actually structs in structs, which get individually aligned. - format = "PPixxxxiiiiiiixxxxP" + format = format + "iiiiiiixxxxP" else: - format = "PPiiiiiiiiP" + format = format + "iiiiiiiP" buf = win32gui.PyMakeBuffer(struct.calcsize(format), lparam) return _MakeResult("NMITEMACTIVATE hwndFrom idFrom code iItem iSubItem uNewState uOldState uChanged actionx actiony lParam", struct.unpack(format, buf)) @@ -410,7 +419,13 @@ # Unpack the lparm from a "TVNOTIFY" message def UnpackTVNOTIFY(lparam): - format = "Piii40s40s" + item_size = struct.calcsize(_tvitem_fmt) + format = _nmhdr_fmt + _nmhdr_align_padding + if is64bit: + format = format + "ixxxx" + else: + format = format + "i" + format = format + "%ds%ds" % (item_size, item_size) buf = win32gui.PyGetMemory(lparam, struct.calcsize(format)) hwndFrom, id, code, action, buf_old, buf_new \ = struct.unpack(format, buf) @@ -420,7 +435,8 @@ (hwndFrom, id, code, action, item_old, item_new)) def UnpackTVDISPINFO(lparam): - format = "Pii40s" + item_size = struct.calcsize(_tvitem_fmt) + format = "PPi%ds" % (item_size,) buf = win32gui.PyGetMemory(lparam, struct.calcsize(format)) hwndFrom, id, code, buf_item = struct.unpack(format, buf) item = UnpackTVITEM(buf_item) @@ -489,7 +505,8 @@ # Unpack an "LVNOTIFY" message def UnpackLVDISPINFO(lparam): - format = "Pii40s" + item_size = struct.calcsize(_lvitem_fmt) + format = _nmhdr_fmt + _nmhdr_align_padding + ("%ds" % (item_size,)) buf = win32gui.PyGetMemory(lparam, struct.calcsize(format)) hwndFrom, id, code, buf_item = struct.unpack(format, buf) item = UnpackLVITEM(buf_item) @@ -497,7 +514,10 @@ (hwndFrom, id, code, item)) def UnpackLVNOTIFY(lparam): - format = "Pii7iP" + format = _nmhdr_fmt + _nmhdr_align_padding + "7i" + if is64bit: + format = format + "xxxx" # point needs padding. + format = format + "P" buf = win32gui.PyGetMemory(lparam, struct.calcsize(format)) hwndFrom, id, code, item, subitem, newstate, oldstate, \ changed, pt_x, pt_y, lparam = struct.unpack(format, buf) @@ -621,7 +641,7 @@ text_addr, _ = text_buffer.buffer_info() text_len = len(text) - format = "iiPPiiiiiii" + format = "iiPPiiPiiii" buf = struct.pack(format, mask, cxy, text_addr, hbm, text_len, fmt, param, image, order, 0, 0) |