使用智能指针在窗口消息中将对象作为WPARAM传递

时间:2012-07-02 09:20:17

标签: c++ mfc c++11

我正在寻找一种方法来传递一个对象(在我的情况下为vector<long>)作为C ++ 11风格的WPARAM

我发现的教程使用C风格的强制转换或reinterpret_cast来传递指向对象的指针。这要求邮件的收件人在收到邮件后正确处理该文件。

有没有办法使用unique_ptr传递对象?收件人可以完全拥有该对象。

3 个答案:

答案 0 :(得分:3)

如果您将指针传递给带有Windows消息的对象,那么您需要确保两件事:

  1. 在处理邮件之前,源不会销毁对象
  2. 目的地在必要时正确销毁对象
  3. 如果您知道肯定会处理该消息,那么您可以在发送消息时在源.release()上呼叫unique_ptr,然后使用另一个unique_ptr获取处理程序中的所有权。

    问题在于确保在未处理消息时清理它。这很棘手,因为除非您使用SendMessage(不是PostMessage)并使用返回值来表示参数已被声明,否则通常不会检查干净的方法。

答案 1 :(得分:1)

没有这样的方法。 WPARAM在标头中定义为UINT_PTR。它只是一个足以在所有架构中接受指针的数字。您可以传递指针的原因是指针本身只是数字。

答案 2 :(得分:1)

您可以执行以下操作:在堆上分配shared_ptr<> (!),将指针作为WPARAM传递给它,在接收和删除时复制shared_ptr<>你得到的WPARAM