Segfault при установке пользовательского IMessageFilter в приложении Python.net - PullRequest
1 голос
/ 29 сентября 2019

Я пытаюсь добавить пользовательский IMessageFilter в приложение Winforms, использующее Python.net, но у меня возникает ошибка.

Вот минимальный пример приложения:

import clr
clr.AddReference("System.Windows.Forms")
import System.Windows.Forms as WinForms


class MessageFilter(WinForms.IMessageFilter):
    __namespace__ = 'System.Windows.Forms'

    def PreFilterMessage(self, message):
        print('filter', message)
        return False


class HelloApp(WinForms.Form):
    def __init__(self):
        self.textbox = WinForms.TextBox()
        self.textbox.Text = "Hello World"
        self.Controls.Add(self.textbox)


def main():
    form = HelloApp()
    app = WinForms.Application
    f = MessageFilter()
    app.AddMessageFilter(f)
    app.Run(form)


if __name__ == '__main__':
    main()

Если вы запустите этот код, как показано, появится окно приложения, но вы сразу получите ошибку (я полагаю, это когда первое сообщениеперешел на фильтр). Segfault полностью непрозрачен. Там нет трассировки стека или других полезных деталей - это просто обработчик сегфоута на уровне ОС.

Если вы закомментируете строку 25 (app.AddMessageFilter(f), устанавливая реальный фильтр), код работает нормально.

Если вы измените MessageFilter так, чтобы он не делился на подкласс Winforms.IMessageFilter, вы получите сообщение о том, что нет метода AddMessageFilter, соответствующего указанным аргументам.

Если вы переименуете или удалите PreFilterMessage()метод, вы получаете сообщение об ошибке, что у объекта Python нет PreFilterMessage метода.

Есть предложения о том, что я делаю неправильно, и / или как это исправить? Или как получить больше отладочной информации, которая могла бы указывать на источник segfault?

1 Ответ

0 голосов
/ 03 октября 2019

Похоже, что это ошибка в самом Python.net, связанная с проблемой с маршалингом byref аргументов. Подробности можно найти здесь .

...