2

vector<long>オブジェクト (私の場合) をWPARAMC++11 スタイルとして渡す方法を探しています。

reinterpret_cast私が見つけたチュートリアルでは、オブジェクトへのポインターを渡すためにC スタイルのキャストまたは aを使用していました。これには、メッセージの受信者がオブジェクトを受信後に適切に破棄する必要があります。

を使用してオブジェクトを渡す方法はありunique_ptrますか? 受信者は、オブジェクトの完全な所有権を取得できます。

4

3 に答える 3

3

Windowsメッセージを含むオブジェクトへのポインタを渡す場合は、次の2つのことを確認する必要があります。

  1. メッセージが処理される前に、ソースがオブジェクトを破棄することはありません
  2. 宛先は、必要に応じてオブジェクトを正しく破棄します

.release()メッセージが確実に処理されることがわかっている場合は、メッセージを送信するときにソースを呼び出してからunique_ptr、別のハンドラーの所有権を取得できunique_ptrます。

問題は、メッセージが処理されない場合に確実にクリーンアップされることにあります。SendMessageこれは注意が必要です。通常、 (ではなくPostMessage)を使用し、戻り値を使用してパラメーターが要求されたことを通知しない限り、チェックするためのクリーンな方法はありません。

于 2012-07-02T09:28:06.873 に答える
1

そのような方法はありません。WPARAMは、ヘッダーでUINT_PTRとして定義されています。これは、すべてのアーキテクチャでポインタを受け入れるのに十分な大きさの数値です。ポインタを渡すことができる理由は、ポインタ自体が実際には単なる数値だからです。

于 2012-07-02T09:24:14.797 に答える
1

次のトリックを実行できます:shared_ptr<> オン ヒープ(!) を割り当て、そのポインターを WPARAM として渡し、shared_ptr<>受信時に をコピーし、取得したものを として削除しますWPARAM

于 2012-07-02T09:26:33.937 に答える