代码之家  ›  专栏  ›  技术社区  ›  Kevin Montrose

WinForm未接收消息,创建后立即接收的消息除外

  •  0
  • Kevin Montrose  · 技术社区  · 15 年前

    我在DLL中有一些非托管代码。它发布了一些方法,我的调用(托管)代码使用这些方法钩住一些COM通知。我创建了一个隐藏的控件派生对象,并传递它的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);
    

    创建InteropWindow后不久,对SendMessage的调用就成功了。之后(几秒钟后),消息停止到达WndProc,尽管没有任何错误迹象。

    问题是,我做错了什么?


    我已经排除了生命周期问题(无论如何,据我所知),并且使用HandleRef没有任何效果。


    我写这篇文章是为了使用函数调用,虽然函数调用本身充满了危险,但工作起来更像我预期的那样。我开始怀疑这是一个COM线程问题,但这只是直觉。

    1 回复  |  直到 15 年前
        1
  •  1
  •   jonathanpeppers    15 年前

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

    您还可以加载.Net探查器并查看GC。很高兴知道你的应用程序是否在一次收集之后就坏了。