C++ “我怎么能?”;“验证”;CWnd*对象? (太长了,读不下去了)

C++ “我怎么能?”;“验证”;CWnd*对象? (太长了,读不下去了),c++,windows,mfc,C++,Windows,Mfc,我正在实现一个处理程序来关闭在软件应用程序中打开的选定窗口。下面是一个粗略的代码: 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->

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

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);
        }
    }
}
我知道简单的解决方法是以相反的方向迭代向量。然而,我也在尝试将这种方法集成到其他几个软件上,它们不一定以相同的方式组织它们的窗口

所以,在上面所有的长问题之后,这里是TL;博士:


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

一种可能是从主窗口开始,如果找到有问题的HWND,则递归搜索子窗口


使用
CWnd::GetWindow(GW\u child)
获取第一个子窗口,使用
CWnd::GetWindow(GW\u hwnnext)
获取下一个窗口使用解除分配的对象是未定义的行为。没有办法从中恢复过来。您需要一种从不访问解除分配对象的策略。指针可以指向任何地方:有效位置和无效位置(地址处没有内存等)。当指针指向内存的有效区域时,验证就更难了。如果没有更好的数据,就无法判断指针是否指向有效对象、相同类型的错误对象或不兼容类型的对象。
if(pWN->checked&&IsWindow(pWN->pWN->GetSafeHwnd())
您没有检查
pWN
是否为非空,与
pWN->pWnd
相同,您也可以通过
AfxGetApp()->m_pMainWnd
直接访问框架窗口,您需要修复错误。您的具体错误是:存储冗余信息。如果它不是多余的,您就不会遇到不确定指针是否有效的情况。而且根本没有办法验证指针是否指向特定类型的对象。@BarmakShemirani:我已经去掉了它们,因为即使指针无效,取消引用其中任何一个也不一定返回NULL。
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;
    ...
}
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.