在 Python.net 应用程序中安装自定义 IMessageFilter 时出现段错误
Segfault when installing custom IMessageFilter in Python.net app
我正在尝试使用 Python.net 在 Winforms 应用程序中添加自定义 IMessageFilter
,但出现段错误。
这是一个最小的示例应用程序:
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()
如果您 运行 显示此代码,应用程序 window 会显示,但您会立即收到段错误(我假设这是第一条消息传递到过滤器时)。段错误是完全不透明的。没有堆栈跟踪或其他有用的详细信息 - 它只是 OS 级别的段错误处理程序。
如果注释掉第 25 行(app.AddMessageFilter(f)
,安装实际的过滤器),代码工作正常。
如果您修改 MessageFilter
使其不子类化 Winforms.IMessageFilter
,您会收到一条错误消息,指出没有 AddMessageFilter
方法匹配给定的参数。
如果您重命名或删除 PreFilterMessage()
方法,您会收到一个错误,指出 Python 对象没有 PreFilterMessage
方法。
关于我做错了什么的任何建议,and/or如何解决?或者如何获得更多可以指向段错误源的调试信息?
这似乎是 Python.net 本身的错误,与编组 byref
参数的问题有关。详情可见here.
我正在尝试使用 Python.net 在 Winforms 应用程序中添加自定义 IMessageFilter
,但出现段错误。
这是一个最小的示例应用程序:
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()
如果您 运行 显示此代码,应用程序 window 会显示,但您会立即收到段错误(我假设这是第一条消息传递到过滤器时)。段错误是完全不透明的。没有堆栈跟踪或其他有用的详细信息 - 它只是 OS 级别的段错误处理程序。
如果注释掉第 25 行(app.AddMessageFilter(f)
,安装实际的过滤器),代码工作正常。
如果您修改 MessageFilter
使其不子类化 Winforms.IMessageFilter
,您会收到一条错误消息,指出没有 AddMessageFilter
方法匹配给定的参数。
如果您重命名或删除 PreFilterMessage()
方法,您会收到一个错误,指出 Python 对象没有 PreFilterMessage
方法。
关于我做错了什么的任何建议,and/or如何解决?或者如何获得更多可以指向段错误源的调试信息?
这似乎是 Python.net 本身的错误,与编组 byref
参数的问题有关。详情可见here.