首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WinForm除创建后立即不接收消息

问WinForm除创建后立即不接收消息
EN

Stack Overflow用户
提问于 2009-07-13 02:09:09
回答 1查看 198关注 0票数 0

我在DLL中有一些非托管代码。它发布了一些方法,我的调用(托管)代码使用这些方法连接到一些COM通知。我没有处理调用回托管代码的非托管代码,而是创建了一个隐藏的Control派生对象,并将其句柄属性传递给SendMessage。

派生类:

代码语言:javascript
复制
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);
  }
}

非托管代码中的相关行:

代码语言:javascript
复制
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线程问题,但这只是直觉。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-07-13 18:58:52

您是否尝试将托管窗口的句柄作为HandleRef传递?C#可以将HandleRef编组为IntPtr,反之亦然,我曾见过微软在解压缩它们的部分内容时经常使用这个技巧。

您还可以加载一个.Net分析器并查看GC。很高兴知道你的应用程序是否在收藏之后就崩溃了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1117486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档