CWnd::GetParent 导致异常

Posted

技术标签:

【中文标题】CWnd::GetParent 导致异常【英文标题】:CWnd::GetParent causes an exception 【发布时间】: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() 的竞争条件。 【参考方案1】:

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

这是 VS 2010 的实现:

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

您的 m_hWnd 不是窗口...

【讨论】:

以上是关于CWnd::GetParent 导致异常的主要内容,如果未能解决你的问题,请参考以下文章

MFC子窗口调用父窗口控件问题,望大神解救~~~

WPF 线程中异常导致程序崩溃

为啥这个 JDBC 语句会导致异常?

如何知道导致异常的确切代码行?

调试导致异常?

rsyslog服务异常导致Python rpc服务启动异常的排查