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 导致异常的主要内容,如果未能解决你的问题,请参考以下文章