Мессаги больше WM_USER - а именно такие используют, например, все Common Controls - по умолчанию не маршалятся, т.е. передаваемый в них указатель должен указывать на данные в АП получателя. Значит, надо как-то внедрять туда свой участок памяти и передавать указатель на него.
Эта техника не нова, она использовалась Оловянниковым в его примере "Who lives in my system tray" (правда, он у меня так и не заработал ни на одной Винде) и мной в теме "Расширить часики в трее". Здесь я хотел построить реюзабельный компонент для этого дела, чтобы не изобретать велосипед каждый раз.
Структура компонента: 2 файла - modMarshal.bas и cMarshal.cls
CreateMarshal создаёт по hWnd маршалер (объект cMarshal) заданного размера (по умолчанию - 1024 байта).
cMarshal::MarshalInto передаёт данные в процесс получателя
cMarshal::MarshalFrom получает данные из процесса получателя
cMarshal::SendMarshalledMessage шлёт сообщение указанному при создании объекта окну. Маршалится заданное количество байт, начиная с адреса lParam.
Объект cMarshal при своём уничтожении сам закроет все хэндлы, об этом заботиться не надо.
Совместимость: проверено на Win98, Win2000, WinXP; скорее всего, будет работать и в WinNT4.
Приложен пример использования: получение значков из Быстрого Запуска. Если раскомментировать начало Form_Load, то (в Win2000+) значки будут получаться из трея.