gpt4 book ai didi

c++ - 我怎样才能得到 "validate"CWnd* 对象?

转载 作者:行者123 更新时间:2023-11-30 05:32:43 25 4
gpt4 key购买 nike

(最后一行有一个 TL;DR)

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

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);
}
}
}

下面是上面显示的参数的一些声明:

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 类(即不同类型的存在窗口以显示文档的不同显示)。

enter image description here

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

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

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.

我知道最简单的解决方法是沿相反方向遍历 vector 。但是,我也在尝试将此方法集成到其他几个软件中,但它们不一定以相同的方式组织窗口。

所以,在回答完上面的长问题之后,这里是 TL;DR:

有什么方法可以检查 CWnd* 实例是否指向有效窗口?

最佳答案

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

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

关于c++ - 我怎样才能得到 "validate"CWnd* 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35042472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com