Windows and Subclassing - 'OverflowError': int too long to convert

Eko palypse ekopalypse at gmail.com
Wed Jul 29 15:32:19 EDT 2020


Hello Eryk,
thank you for your interest in my problem and you've nailed it, the problem
was solved by putting all Windows API definitions in a separate module and
making sure that I only use WinDLL.
I would never have thought of that, because I only used WinDLL in this
module.
But a PostMessage in another module, which I created with windll, seems to
have confused things a bit and now that I have merged this and other
modules into one, I don't see the problem anymore.
Here is the desired excerpt. (user32 is now import from win32api, where all
other definitions are now also)

    def new_scintilla2_proc(self, hWnd, msg, wParam, lParam):
        if self.__WndProc(hWnd, msg, wParam, lParam):
            return 0

        print(f'{hWnd=}, {msg=}, {wParam=}, {lParam=}')
        return user32.CallWindowProcW(self.prev_scintilla2_wnd_proc, hWnd,
msg, wParam, lParam)


    def __WndProc(self, hWnd, msg, wParam, lParam):
        event_handler = self._event_handler.get(msg, None)
        if event_handler:
            return event_handler(msg, wParam, lParam)
        return False

Once again, thank you
Eren

Am Mi., 29. Juli 2020 um 16:26 Uhr schrieb Eryk Sun <eryksun at gmail.com>:

> On 7/28/20, Eko palypse <ekopalypse at gmail.com> wrote:
> >
> > Now when I get this error the message I receive in this situation is
> always
> > like this.
> >
> > hWnd=197364, msg=20, wParam=*18446744072652653190*, lParam=0
> >
> > Traceback (most recent call last):
> >   File "_ctypes/callbacks.c", line 237, in 'calling callback function'
> >   File "<string>", line 121, in new_scintilla2_proc
> > ctypes.ArgumentError: argument 4: <class 'OverflowError'>: int too long
> to
> > convert
>
> Can you provide a more complete example of how you're calling
> CallWindowProcW in new_scintilla2_proc? It seems like a function
> pointer is being called that doesn't have argtypes defined. For
> example:
>
>     >>> user32 = ctypes.WinDLL('user32', use_last_error=True)
>     >>> user32.CallWindowProcW(None, None, 0x14, 18446744072652653190, 0)
>     Traceback (most recent call last):
>       File "<stdin>", line 1, in <module>
>     ctypes.ArgumentError: argument 4: <class 'OverflowError'>: int too
> long to convert
>
> Perhaps in new_scintilla2_proc you're using a different instance of
> ctypes.WinDLL, or you switched to using ctypes.windll.user32. I
> recommend avoiding the global ctypes.LibraryLoader instances --
> ctypes.cdll, ctypes.windll, and ctypes.oledll -- because using them
> leads to conflicts with other libraries, but you do need to use a
> single instance of ctypes.WinDLL for your user32 function prototypes,
> imported from a common module.
>


More information about the Python-list mailing list