You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VS2005单SDI MFC DLL中获取Cc2viewDoc指针求助

获取Cc2viewDoc指针的可行方案

方案一:从主窗口指针获取视图与文档

既然你已经拿到主窗口指针(假设为CMainFrame* pMainFrame),SDI框架中主窗口的GetActiveView()方法可直接返回当前激活的视图指针,再通过视图的m_pDocument成员即可拿到文档类指针:

// 假设pMainFrame是已获取的主窗口指针
Cc2viewView* pView = dynamic_cast<Cc2viewView*>(pMainFrame->GetActiveView());
if (pView != nullptr) {
    Cc2viewDoc* pDoc = dynamic_cast<Cc2viewDoc*>(pView->m_pDocument);
    if (pDoc != nullptr) {
        // 此处可更新文档成员变量,例如 pDoc->m_a = a; pDoc->m_b = b;
    }
}

注:若在非MFC线程环境调用,需确保先进入MFC线程上下文(SDI通常为单线程,大概率无需额外处理)。

方案二:通过应用程序对象获取文档模板与文档

之前用AfxGetApp()失败,可能是未正确遍历文档模板。SDI应用仅含一个文档模板,直接获取第一个即可:

CWinApp* pApp = AfxGetApp();
if (pApp != nullptr) {
    POSITION pos = pApp->GetFirstDocTemplatePosition();
    CDocTemplate* pDocTemplate = pApp->GetNextDocTemplate(pos);
    if (pDocTemplate != nullptr) {
        POSITION docPos = pDocTemplate->GetFirstDocPosition();
        Cc2viewDoc* pDoc = dynamic_cast<Cc2viewDoc*>(pDocTemplate->GetNextDoc(docPos));
        if (pDoc != nullptr) {
            // 操作文档成员变量
        }
    }
}

SDI结构下GetNextDoc仅会返回一个文档对象,该方法可靠性较高。

方案三:通过窗口类名查找视图窗口

若主窗口指针获取存在问题,可通过视图类的窗口类名查找视图窗口,再转换为视图指针:

// 先用Spy++获取视图窗口的准确类名,替换下方的类名字符串
HWND hViewWnd = FindWindow(_T("Cc2viewView"), nullptr);
if (hViewWnd != nullptr) {
    Cc2viewView* pView = dynamic_cast<Cc2viewView*>(CWnd::FromHandle(hViewWnd));
    if (pView != nullptr) {
        Cc2viewDoc* pDoc = dynamic_cast<Cc2viewDoc*>(pView->m_pDocument);
        // 操作文档成员变量
    }
}

内容的提问来源于stack exchange,提问作者bill g

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 21:12:52