WinForm не получает сообщения, кроме как сразу после создания - PullRequest
0 голосов
/ 13 июля 2009

У меня есть какой-то неуправляемый код в 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-потоками, но это просто внутреннее чувство.

1 Ответ

1 голос
/ 13 июля 2009

Вы пытались передать дескриптор вашего управляемого окна как HandleRef? C # может маршалировать HandleRef как IntPtr, и наоборот, я видел, как Microsoft довольно часто использовал этот трюк при декомпиляции некоторых своих вещей.

Вы также можете загрузить профилировщик .Net и посмотреть GC. Было бы неплохо узнать, работает ли ваше приложение сразу после сбора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...