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() がメッセージを処理するためにウィンドウ プロシージャの 1 つを呼び出しており、そのウィンドウ プロシージャが見つからないことを意味すると思います。最初は、メッセージを覗いているだけなので、Peekmessage がウィンドウ プロシージャを呼び出す理由がわかりませんでしたが、ここや他の場所をさらに読むと、次のことがわかります。

  • PeekMessage() は、他のスレッドから送信された SendMessages() を処理します
  • PeekMessage() は Paint メッセージを処理する場合があります
  • WM_ERASEBKGND などの他のメッセージに対して、PeekMessage がウィンドウ プロシージャを呼び出していることを報告した人もいます。

MSDN から:

SendMessageこの呼び出し中、システムは保留中のキューに入れられていないメッセージ、つまり、、、、または関数を使用して呼び出しスレッドが所有するウィンドウに送信されたメッセージを配信SendMessageCallbackSendMessageTimeoutますSendNotifyMessage

SendMessage() 呼び出しがすぐに処理されると思っていたので、よくわかりません。SendMessage が別のスレッドからのものである場合にのみ、これが適用されると他の誰かが考えているようです。

スタンドアロン プロジェクトでこれを複製することはできません。エラーから、PeekMessage が存在しないウィンドウ プロシージャを呼び出しているように見えます。それを無視します。フォームのデストラクタからそれ自体やその他のあらゆる種類のものにメッセージを投稿しようとしましたが、失敗することはありません。

他に確認すべきことについて何か提案はありますか?前もって感謝します。

リック

4

0 に答える 0