На первый вопрос, да, LPARAM предназначен для использования в качестве целого числа или указателя.Это ясно из определения:
typedef LONG_PTR LPARAM;
Это целое число, достаточно длинное, чтобы содержать указатель.
Что касается элемента shared_ptr, вы правы, если вы передадите необработанный указатель и обернетесьэто в другой shared_ptr, вы освободите его дважды:
shared_ptr<Thing> a;
PostThreadMessage(x, 0, (LPARAM)a.get());
...
LRESULT OnMessage(int msg, WPARAM wp, LPARAM lp)
{
shared_ptr<Thing> p((Thing*)lp); //Bad!!!
}
Но вместо этого вы можете попробовать этот обходной путь:
shared_ptr<Thing> a;
PostThreadMessage(x, 0, new shared_ptr<Thing>(a)); //pointer to smart-pointer
...
LRESULT OnMessage(int msg, WPARAM wp, LPARAM lp)
{
shared_ptr<Thing> *pp = (shared_ptr<Thing>*)lp;
shared_ptr<Thing> p(*pp);
delete pp; //no leak
}
AFTERTHOUGHT : обратите внимание, что PostThreadMessage может завершиться ошибкой.... и вы не хотите пропускать shared_ptr.
По моему опыту, обычно лучше использовать std :: deque для хранения данных и использовать PostThreadMessage для уведомления о том, что там есть данные.Таким образом, вы никогда не потеряете объект!YMMV