首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何“验证”CWnd*对象?

如何“验证”CWnd*对象?
EN

Stack Overflow用户
提问于 2016-01-27 16:14:04
回答 1查看 1K关注 0票数 1

(最后一行是TL;DR )

我正在实现一个处理程序来关闭软件应用程序中打开的选定窗口。下面是一个粗略的代码:

代码语言:javascript
复制
void CDlg_Dummy_Dialog::OnCloseWindows()
{
    for (int i = 0; i < m_WindowsInfo.size(); i++) {
        Window_Node *pWN = &m_WindowsInfo.at(i);
        if (pWN->checked && IsWindow(pWN->pWnd->GetSafeHwnd())) {
            pWN->pWnd->GetParentFrame()->SendMessage(WM_CLOSE);
        }
    }
}

以下是对上述参数的一些声明:

代码语言:javascript
复制
struct Window_Node {
    CString name;
    CString path;
    CWnd *pWnd;
    BOOL checked;
    HICON icon;
    ....
};

class CDlg_Dummy_Dialog : public CDialog {
    ...
protected:
    std::vector<struct Window_Node> m_WindowsInfo;
    ...
}

此外,可以有多个Window_Node实例,具有不同的pWnd参数,它们起源于单个CDocument类(即。存在不同类型的窗口以显示文档的不同显示)。

对于此软件,如果关闭了文档的第一个窗口(图表中的“绿色”窗口类型),则与该文档相关的所有其他窗口都将自动关闭。这就是问题发生的地方。

如果用户从同一个文档中选择多个窗口(其中包含绿色窗口),则在完成第一次迭代时关闭所有窗口,并且所有pWnd指针现在都指向一个现在未分配的内存。因此,当它试图在下一次迭代中调用GetSafeHwnd()时,它会提示内存访问冲突错误:

代码语言:javascript
复制
First-chance exception at 0x00000000521B4AD0 (mfc100d.dll) in Settle3D.exe: 0xC0000005: Access violation reading location 0x00000000136943E0.
Unhandled exception at 0x00000000521B4AD0 (mfc100d.dll) in Settle3D.exe: 0xC000041D: An unhandled exception was encountered during a user callback.

我知道,简单的修复方法是在相反的方向遍历向量。然而,我也在尝试将这个方法集成到其他几个软件上,它们并不一定以相同的方式组织它们的窗口。

因此,在上面提出了这么长的问题之后,这里是TL;DR:

是否有任何方法检查CWnd*的实例是否指向有效窗口?

EN

回答 1

Stack Overflow用户

发布于 2016-01-27 16:31:24

一种可能的方法是从主窗口开始,如果发现HWND问题,可以递归地在子窗口中搜索。

使用CWnd::GetWindow(GW_CHILD)获取第一个子窗口,用CWnd::GetWindow(GW_HWNDNEXT)获取下一个窗口。

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

https://stackoverflow.com/questions/35042472

复制
相关文章

相似问题

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