3

定期从 PeekMessage 获取访问冲突。这不是我对 PeekMessage 的调用,它来自 Application.Run。MadExcept 的堆栈跟踪显示 Application.Run 调用 PeekMessage,而后者又调用 kiUserCallBackDispatcher。

德尔福 2009。

堆栈跟踪是:

callstack crc     : $0202d0d7, $a09d5671, $3195cde5
exception number  : 1
exception class   : EAccessViolation
exception message : Access violation at address 0202D0D7. Write of address 00310038.

main thread ($1650):
0202d0d7 +000 ???
7c90e470 +010 ntdll.dll                               KiUserCallbackDispatcher
7e4193fd +162 USER32.dll                              PeekMessageW
0050b2a4 +01c infraWrapper90.exe Forms                TApplication.ProcessMessage
0050b3ea +00a infraWrapper90.exe Forms                TApplication.HandleMessage
0050b715 +0c9 infraWrapper90.exe Forms                TApplication.Run

我认为这意味着 PeekMessage() 正在调用我的一个窗口过程来处理消息,但它找不到那个窗口过程。起初我不明白为什么 Peekmessage 会调用任何窗口过程,因为它只是在查看消息,但是从这里和其他地方的进一步阅读中我想我看到了:

  • PeekMessage() 将处理从其他线程发送的 SendMessages()
  • PeekMessage() 有时会处理 Paint 消息
  • 其他人报告说看到 PeekMessage 为其他消息调用 Window 过程,例如 WM_ERASEBKGND。

来自 MSDN:

在此调用期间,系统会传递待处理的非排队消息,即使用SendMessageSendMessageCallbackSendMessageTimeoutSendNotifyMessage函数发送到调用线程拥有的窗口的消息。

我不太明白,因为我认为 SendMessage() 调用会立即处理。其他人似乎认为这仅适用于 SendMessage 来自另一个线程时。

我不能在一个独立的项目中复制它。从错误看来,好像 PeekMessage 正在调用一个不再存在的窗口过程 - 但我自己尝试通过故意破坏表单然后对无效窗口句柄执行 SendMessage() 和 Postmessage() 来做到这一点,而 Windows 似乎只是忽略它。我已经尝试将消息从表单的析构函数发送到自身以及其他各种事情,但我不能让它失败。

关于其他要检查的任何建议?提前致谢。

瑞克

4

0 回答 0