У меня есть какой-то неуправляемый код в DLL. Он публикует некоторые методы, которые мой вызывающий (управляемый) код использует для подключения к некоторым COM-уведомлениям. Вместо того чтобы иметь дело с неуправляемым кодом, вызывающим обратно в управляемый код, я создал скрытый производный объект Control и передаю его свойство handle, которое неуправляемый код затем использует в качестве параметра для SendMessage.
Производный класс My Control:
class InteropWindow : Control
{
//delegate
private Handler m_callback;
//window message
private uint m_message;
public InteropWindow(Handler callback, uint message)
: base()
{
m_callback = callback;
m_message = message;
}
protected override void WndProc(ref Message m)
{
if (m.Msg == m_message)
{
m_callback(new IntPtr((int)m.WParam));
}
base.WndProc(ref m);
}
}
Соответствующая строка в неуправляемом коде:
SendMessage(m_notify, m_window_message, (WPARAM)pData, 0);
m_window_message & m_message одинаковы (оба из RegisterWindowMessage) и m_notify == InteropWindow.Handle (pData варьируется, но используется как непрозрачный дескриптор в управляемом коде). Неуправляемый код вызывается. Эти факты были подтверждены с помощью отладки.
Вскоре после создания InteropWindow вызовы SendMessage завершаются успешно. После этого (через несколько секунд) сообщения перестают поступать в WndProc, хотя нет никаких признаков какой-либо ошибки.
Вопрос в том, что я здесь не так делаю?
Я исключил проблемы жизненного цикла (насколько мне известно), и безуспешно играл с HandleRef.
Редактировать второе.
Я переписал это, чтобы вместо этого использовать вызовы функций, что, хотя и чревато своими опасностями, работает немного больше, чем я ожидал. Я подозреваю, что это проблема с COM-потоками, но это просто внутреннее чувство.