【问题标题】:CWnd::GetParent causes an exceptionCWnd::GetParent 导致异常
【发布时间】:2013-02-19 12:26:48
【问题描述】:

我正在尝试调用 CWnd 类的函数 GetParent()。 每次都会抛出异常。 我正在从工作线程调用该函数。

这是导致异常的行: CWnd* parent = this->GetParent();

我也试过“GetParent()->PostMessage(........);”,还是抛出异常。

我在 CDialog 中使用此方法。

我注意到 CWnd 成员 m_hWnd 有时是 0x00000000 或 0x00000001。 在另一台计算机上,我没有收到此异常。 是项目设置有问题还是我的代码有问题?

【问题讨论】:

  • 贴出相关代码(5-6行代码围绕错误行)
  • 由于 CDialog 派生自 CWnd,它必须有一个名为 m_hWnd 的成员,如果值为 != 0,请在调试器中检查。
  • 您说“来自工作线程”。这是否意味着您已经在 AfxBeginThread 启动的线程上创建了这个 CWnd 类,如果是这样,您是否有 followed msdn.microsoft.com 来覆盖 InitInstance 函数?由于这适用于另一台计算机,并且正如@neagoegab 指出的那样,您的 m_hWnd 不是有效窗口,因此您可能正在处理在创建和初始化 CWnd 之前调用 GetParent() 的竞争条件。

标签: c++ mfc cdialog cwnd


【解决方案1】:

您收到的是断言,而不是异常。

这是 VS 2010 的实现:

ASSERT(::IsWindow(m_hWnd)); return CWnd::FromHandle(::GetParent(m_hWnd));

您的 m_hWnd 不是窗口...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 2011-06-08
    • 2017-02-16
    • 2018-11-09
    • 2014-03-13
    • 2011-09-06
    相关资源
    最近更新 更多