Вы не можете передать адрес строки в PostMessage, так как строка, вероятно, является локальной для потока в стеке. К тому времени, когда другой поток получит его, он мог быть уничтожен.
Вместо этого вы должны создать новую строку или объект исключения через new и передать его адрес другому потоку (через параметр WPARAM или LPARAM в PostMessage.) Затем другой поток владеет объектом и отвечает за его уничтожение.
Вот пример кода, который показывает, как это можно сделать:
try
{
//do stuff
}
catch (MyException& the_exception)
{
PostMessage(MyhWnd, CWM_SOME_ERROR, 0, new string(the_exception.error_string));
}
LPARAM CMyDlg::SomeError(WPARAM, LPARAM lParam)
{
// Put in shared_ptr so it is automatically destroyed.
shared_ptr<string> msg = reinterpret_cast<string*>(lParam);
// Do stuff with message
return 0;
}