4

簡単なタスク:動的に割り当てられたデータ(任意の長さの文字列など)を含むWindowsメッセージを送信します。このデータを解放する責任をどのように管理しますか?

Windowsメッセージの受信者は、このデータを解放する責任がある可能性があります。しかし:すべてのメッセージが実際に受信され、リンクされたデータが解放されることをどのように保証できますか?受信者がシャットダウンしている状況を想像してみてください。そうすれば、受信者はメッセージキューを処理しなくなります。ただし、メッセージキューは(しばらくの間)まだ存在しており、メッセージを受け入れることができます。メッセージはこれ以上処理されません。

ありがとう!

4

2 に答える 2

2

PostMessageBOOLは、メッセージが投稿されたかどうかを示すを返します。WM_DESTROYウィンドウはとWM_NCDESTROYメッセージを受信するまで有効である必要があるため、通常はこれで十分です。(これらのメッセージを送信する) DestroyWindowを呼び出した後は、PostMessageを再度正常に呼び出すことができないはずです。

ここで、PostMessageがFALSEを返した場合は、クリーンアップする必要があります。そうでない場合は、ウィンドウプロシージャをクリーンアップする必要があります。クリーンアップする必要のあるメッセージを、それらを処理しない可能性のあるランダムなウィンドウに送信しないでください。実際には、処理していないウィンドウに+xメッセージを送信しないでください WM_USER

于 2011-02-01T20:24:44.567 に答える
1

ここでは何もすることはありません。SendMessageの呼び出しが戻るとすぐに、データを解放できます。たまたま、他のアプリは別のプロセスにあるため、とにかくあなたの記憶を見ていません。代わりに、Windowsはプロセスの境界を越えてデータをマーシャリングします。

さらに、WndProcでデータを受信して​​いる場合、文字列へのポインタのコピーを取得することはできません。代わりに、文字列の内容のコピーを取得する必要があります。これは、そのポインタがWndProcへの呼び出しの間のみ有効であるためです。

もう1つのポイントは、メッセージキューについて混乱しているということです。メッセージを送信すると、それは同期的に発生し、キューは関与しません。メッセージキューは、投稿されたメッセージが配置される場所です。それらは非同期的に処理されます。

于 2011-02-01T17:55:38.287 に答える