定期从 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:
在此调用期间,系统会传递待处理的非排队消息,即使用
SendMessage
、SendMessageCallback
、SendMessageTimeout
或SendNotifyMessage
函数发送到调用线程拥有的窗口的消息。
我不太明白,因为我认为 SendMessage() 调用会立即处理。其他人似乎认为这仅适用于 SendMessage 来自另一个线程时。
我不能在一个独立的项目中复制它。从错误看来,好像 PeekMessage 正在调用一个不再存在的窗口过程 - 但我自己尝试通过故意破坏表单然后对无效窗口句柄执行 SendMessage() 和 Postmessage() 来做到这一点,而 Windows 似乎只是忽略它。我已经尝试将消息从表单的析构函数发送到自身以及其他各种事情,但我不能让它失败。
关于其他要检查的任何建议?提前致谢。
瑞克