WinForm在创建后不接收消息

时间:2009-07-13 02:09:09

标签: c# c++ winforms winapi

我在DLL中有一些非托管代码。它发布了一些我的调用(托管)代码用于挂钩到某些COM通知的方法。我没有处理回调到托管代码的非托管代码,而是创建了一个隐藏的Control派生对象,并传递了handle属性,然后非托管代码将其用作SendMessage的参数。

我的控件派生类:

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 个答案:

答案 0 :(得分:1)

您是否尝试将托管窗口的句柄作为HandleRef传递? C#可以将HandleRef编组为IntPtr,反之亦然,我看到微软在反编译它们的一些东西时会使用这个技巧。

您还可以加载.Net探查器并观察GC。很高兴知道你的应用程序在收集后是否正在破坏。