MDI动态加载文档/视图问题 100分

Biecheny 2005-01-28 08:30:18
在.dll中:
CMultiDocTemplate* Cdll009::myinit()
{
BOOL bSuccess = FALSE;
CMultiDocTemplate* pDocTemplate;
CMultiDocTemplate* pDocTemplate2;
CWinApp* pApp = AfxGetApp();
ASSERT(pApp);
if (pApp)
{
pDocTemplate = new CMultiDocTemplate(
IDR_MENU1,
RUNTIME_CLASS(CMyDoc),
RUNTIME_CLASS(CMDIChildWnd),
RUNTIME_CLASS(CMyView));

pDocTemplate2 = new CMultiDocTemplate(
IDR_MENU1,
RUNTIME_CLASS(CMyDoc),
RUNTIME_CLASS(CMDIChildWnd),
RUNTIME_CLASS(CMyView2));

ASSERT(pDocTemplate);
if (pDocTemplate)
{
pApp->AddDocTemplate(pDocTemplate);
bSuccess = TRUE;
}

}

return pDocTemplate2;
}

在CTest009App类中:
void CTest009App::OnNewt()
{

typedef CMultiDocTemplate* (*MYINIT)();
MYINIT fnMyinit;
FARPROC lpfn=NULL;
HINSTANCE hinst = NULL;
hinst = LoadLibrary("../dll009/Debug/dll009.dll");
if (hinst == NULL)
{
AfxMessageBox("can not load dll");
return;
}
lpfn = GetProcAddress(hinst,"myinit");
fnMyinit = (MYINIT)lpfn;


if(lpfn==NULL)
{
AfxMessageBox("can not get template");
return;
}

pDocTemplate2 = fnMyinit();

CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);

// Dispatch commands specified on the command line
cmdInfo.m_nShellCommand = ::CCommandLineInfo.FileNew;
if (!ProcessShellCommand(cmdInfo))
return;
//取得主框架窗口的指针
CWnd* pMainWnd = AfxGetApp()->m_pMainWnd;
CMainFrame* pMainFrame = (CMainFrame*)pMainWnd;

pMainFrame->OnTestNew();//重载的OnWindowNew()
pMainFrame->MDITile();
}

mainfrm中重载的OnWindowNew()
void CMainFrame::OnTestNew()
{

CMDIChildWnd* pActiveChild = MDIGetActive();
CDocument* pDocument;
if (pActiveChild == NULL ||
(pDocument = pActiveChild->GetActiveDocument()) == NULL)
{
TRACE0("Warning: No active document for WindowNew command.\n");
AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
return; // command failed
}

// otherwise we have a new frame !
CDocTemplate* pTemplate = ((CTest009App*) AfxGetApp())->pDocTemplate2;//pDocument->GetDocTemplate();

ASSERT_VALID(pTemplate);
CFrameWnd* pFrame = pTemplate->CreateNewFrame(pDocument, pActiveChild);
if (pFrame == NULL)
{
TRACE0("Warning: failed to create new frame.\n");
return; // command failed
}

pTemplate->InitialUpdateFrame(pFrame, pDocument);

}
=======================
问题:
在程序第一次加载dll并调用CTest009App::OnNewt()时,一切正常:先构建mainframe,然后加载dll
创建基于一个文档的2个视图,但当关闭2个视图后,在次调用CTest009App::OnNewt()出错
请高手们帮着解决一下,如何能在关闭子窗口时把程序还原成没调用dll和Cdll009::myinit()时的状态(关闭自窗口后再FreeLibrary出错)
分不够再加~

...全文
102 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
red-fly 2005-02-01
  • 打赏
  • 举报
回复
mrk
Biecheny 2005-02-01
  • 打赏
  • 举报
回复
一楼的老兄谢了
重载了一下CDocManager问题已经解决了
张佩 2005-01-29
  • 打赏
  • 举报
回复
强人啊!
老夏Max 2005-01-29
  • 打赏
  • 举报
回复
如果可以的话,可以将程序源代码发到:xia_qingqi@broadxent.com.cn
我帮你看看!注明帖子的URL!
学生成绩管理 ============================================ MICROSOFT 基础类库: StudentScore 项目概述 ============================================ 应用程序向导已为您创建了此 StudentScore 应用程序。此应用程序 不仅介绍了使用 Microsoft 基础类的基本知识, 而且是编写应用程序的起点。 此文件包含组成 StudentScore 应用程序的每个文件的内容摘要。 StudentScore.vcproj 这是使用“应用程序向导”生成的 VC++ 项目的主项目文件。 它包含有关生成文件的 Visual C++ 版本的信息,以及 有关用“应用程序向导”所选择的平台、配置和 项目功能的信息。 StudentScore.h 这是应用程序的主头文件。 它包含其他 项目特定的头文件(包括 Resource.h),并声明 CStudentScoreApp 应用程序类。 StudentScore.cpp 这是包含应用程序 类 CStudentScoreApp 的主应用程序源文件。 StudentScore.rc 这是程序使用的所有 Microsoft Windows 资源 的列表。 它包含存储在 RES 子目录中 的图标、位图和光标。 可直接在 Microsoft Visual C++ 中编辑此文件。 项目资源包含在 2052 中。 resStudentScore.ico 这是一个图标文件,用作应用程序的图标。 此 图标包含在主资源文件 StudentScore.rc 中。 resStudentScore.rc2 此文件包含不由 Microsoft Visual C++ 编辑的资源。 应将所有不能由 资源编辑器编辑的资源放在此文件中。 StudentScore.reg 这是一个 .REG 文件示例,向您显示 框架将为您设置的注册设置类型。 可以将它用作 .REG 文件,以与应用程序一起使用,或干脆删除它而依赖 默认的 RegisterShellFileTypes 注册。 ///////////////////////////////////////////////////////// 对于主框架窗口: 项目将包含标准的 MFC 界面。 MainFrm.h, MainFrm.cpp 这些文件包含框架类 CMainFrame,该类派生自 CMDIFrameWnd 并控制所有的 MDI 框架功能。 resToolbar.bmp 此位图文件用于创建工具栏的平铺图像。 初始工具栏和状态栏在 CMainFrame 类中构造。 使用资源编辑器编辑此工具栏位图,并 更新 StudentScore.rc 中的 IDR_MAINFRAME TOOLBAR 数组以添加 工具栏按钮。 ////////////////////////////////////////////////////////// 对于子框架窗口: ChildFrm.h、ChildFrm.cpp 这些文件定义和实现 CChildFrame 类,此类 支持 MDI 应用程序中的子窗口。 ////////////////////////////////////////////////////////// 应用程序向导将创建一种文档类型和一个视图: StudentScoreDoc.h、StudentScoreDoc.cpp - 文档 这些文件包含 CStudentScoreDoc 类。 编辑这些文件 以添加特殊的文档数据并实现文件的保存和加载 (通过 CStudentScoreDoc::Serialize)。 此文档将具有下列字符串: 文件扩展名: sc 文件类型 ID: StudentScore.Document 主框架标题: StudentScore 文档类型名称: StudentScore 筛选器名称: StudentScore Files (*.sc) 文件的新简称: StudentScore 文件类型全称: StudentScore.Document StudentScoreView.h、StudentScoreView.cpp - 文档视图 这些文件包含 CStudentScoreView 类。 CStudentScoreView 对象用于查看 CStudentScoreDoc 对象。 resStudentScoreDoc.ico 这是一个图标文件,用作 CStudentScoreDoc 类 MDI 子窗口的图标。 此图标包含在主 资源文件 StudentScore.rc 中。 ///////////////////////////////////////////////////////// 其他功能: ActiveX 控件 应用程序支持使用 ActiveX 控件。 ///////////////////////////////////////////////////////// 其他标准文件: StdAfx.h、StdAfx.cpp 这些文件用于生成名为 StudentScore.pch 的预编译头文件 (PCH) 和名为 StdAfx.obj 的预编译类型文件。 Resource.h 这是标准头文件,它定义新资源 ID。 Microsoft Visual C++ 将读取并更新此文件。 ///////////////////////////////////////////////////////// 其他说明: 应用程序向导使用“TODO:” 来指示 应添加或自定义的源代码部。 如果应用程序在共享 DLL 中使用 MFC,且应用程序使用的语言不是 操作系统的当前语言,则需要从 Microsoft Visual C++ 光盘上 WinSystem 目录下将相应的本地化资源 MFC70XXX.DLL 复制到计算机的 system 或 system32 目录下, 并将其重命名为 MFCLOC.DLL。 (“XXX”代表 语言缩写。 例如,MFC70DEU.DLL 包含翻译成 德语的资源。) 如果不这样做,应用程序的某些 UI 元素 将保留为操作系统的语言。 //////////////////////////////////////////////////////////
=======
MICROSOFT 基础类库: StudentScore 项目概述
===============================================================================

应用程序向导已为您创建了此 StudentScore 应用程序。此应用程序
不仅介绍了使用 Microsoft 基础类的基本知识,
而且是编写应用程序的起点。

此文件包含组成 StudentScore 应用程序的每个文件的内容摘要。

StudentScore.vcproj
这是使用“应用程序向导”生成的 VC++ 项目的主项目文件。
它包含有关生成文件的 Visual C++ 版本的信息,以及
有关用“应用程序向导”所选择的平台、配置和
项目功能的信息。

StudentScore.h
这是应用程序的主头文件。 它包含其他
项目特定的头文件(包括 Resource.h),并声明
CStudentScoreApp 应用程序类。

StudentScore.cpp
这是包含应用程序
类 CStudentScoreApp 的主应用程序源文件。

StudentScore.rc
这是程序使用的所有 Microsoft Windows 资源
的列表。 它包含存储在 RES 子目录中
的图标、位图和光标。 可直接在 Microsoft
Visual C++ 中编辑此文件。 项目资源包含在 2052 中。

res\StudentScore.ico
这是一个图标文件,用作应用程序的图标。 此
图标包含在主资源文件 StudentScore.rc 中。

res\StudentScore.rc2
此文件包含不由 Microsoft
Visual C++ 编辑的资源。 应将所有不能由
资源编辑器编辑的资源放在此文件中。
StudentScore.reg
这是一个 .REG 文件示例,向您显示
框架将为您设置的注册设置类型。 可以将它用作 .REG
文件,以与应用程序一起使用,或干脆删除它而依赖
默认的 RegisterShellFileTypes 注册。
/////////////////////////////////////////////////////////////////////////////

对于主框架窗口:
项目将包含标准的 MFC 界面。
MainFrm.h, MainFrm.cpp
这些文件包含框架类 CMainFrame,该类派生自
CMDIFrameWnd 并控制所有的 MDI 框架功能。
res\Toolbar.bmp
此位图文件用于创建工具栏的平铺图像。
初始工具栏和状态栏在 CMainFrame
类中构造。 使用资源编辑器编辑此工具栏位图,并
更新 StudentScore.rc 中的 IDR_MAINFRAME TOOLBAR 数组以添加
工具栏按钮。
/////////////////////////////////////////////////////////////////////////////

对于子框架窗口:

ChildFrm.h、ChildFrm.cpp
这些文件定义和实现 CChildFrame 类,此类
支持 MDI 应用程序中的子窗口。

/////////////////////////////////////////////////////////////////////////////

应用程序向导将创建一种文档类型和一个视图

StudentScoreDoc.h、StudentScoreDoc.cpp - 文档
这些文件包含 CStudentScoreDoc 类。 编辑这些文件
以添加特殊的文档数据并实现文件的保存和加载
(通过 CStudentScoreDoc::Serialize)。
文档将具有下列字符串:
文件扩展名: sc
文件类型 ID: StudentScore.Document
主框架标题: StudentScore
文档类型名称: StudentScore
筛选器名称: StudentScore Files (*.sc)
文件的新简称: StudentScore
文件类型全称: StudentScore.Document
StudentScoreView.h、StudentScoreView.cpp - 文档视图
这些文件包含 CStudentScoreView 类。
CStudentScoreView 对象用于查看 CStudentScoreDoc 对象。
res\StudentScoreDoc.ico
这是一个图标文件,用作
CStudentScoreDoc 类 MDI 子窗口的图标。 此图标包含在主
资源文件 StudentScore.rc 中。
/////////////////////////////////////////////////////////////////////////////

其他功能:

ActiveX 控件
应用程序支持使用 ActiveX 控件。
/////////////////////////////////////////////////////////////////////////////

其他标准文件:

StdAfx.h、StdAfx.cpp
这些文件用于生成名为 StudentScore.pch 的预编译头文件 (PCH)
和名为 StdAfx.obj 的预编译类型文件。

Resource.h
这是标准头文件,它定义新资源 ID。
Microsoft Visual C++ 将读取并更新此文件。

/////////////////////////////////////////////////////////////////////////////

其他说明:

应用程序向导使用“TODO:” 来指示
应添加或自定义的源代码部

如果应用程序在共享 DLL 中使用 MFC,且应用程序使用的语言不是
操作系统的当前语言,则需要从 Microsoft Visual C++ 光盘上
Win\System 目录下将相应的本地化资源 MFC70XXX.DLL
复制到计算机的 system 或 system32 目录下,
并将其重命名为 MFCLOC.DLL。 (“XXX”代表
语言缩写。 例如,MFC70DEU.DLL 包含翻译成
德语的资源。) 如果不这样做,应用程序的某些 UI 元素
将保留为操作系统的语言。

目录第1篇 开发基础篇 第1章 VisualC++6.0开发环境 1.1 VisualC++6.0概述 1.2 认识VisualC++集成开发环境 1.3 IDE菜单栏介绍 1.4 工具栏 1.5 输出窗口 1.6 资源编辑器 1.7 VisualC++学习常见问题 1.8 VisualC++学习方法简介 小结 第2章 利用集成开发环境生成程序 2.1 生成项目(project) 2.2 添加和编辑源文件 2.3 建立程序 2.4 运行程序 2.5 调试程序 2,6VisualC+4.生成的项目文件 2.7 编写控制台应用程序 小结 第3章 Windows程序运行原理 3.1 图形界面操作系统的王者——Windows 3.2 什么是多任务操作系统 3.3 Windows应用程序的组成 3.4 建立API的概念 3.4.1 API的发展 3.4.2 标准Win32API函数类 3.5 一个用API编写的Windows程序 3.6 VisualC++应用程序开发框架:MFC 3.6.1 从API到MFC 3.6.2 MFC是一个编程框架 小结 第4章 开始使用MFC类库 4.1 MFC的起源和发展 4.2 MFC整体类库结构 4.3 常用MFC类简介 4.3.1 应用程序结构类 4.3.2 调试和异常类 4.3.3 文件服务类 4.3.4 图形处理类 4.3 ,5数据库类 4.3.6 Internet支持类 4.4 一个简单的MFC程序 4.5 文档视图结构 4.5.1 文档类 4.5.2 视图类 4.5.3 使用文档视图结构的好处 4.5.4 单文档(SDI)与多文档(MDI)应用程序 4.6 窗口类及其控件栏 4.6.1 子窗口类 4.6.2 主窗口类 4.6.3 工具栏 4.6.4 状态栏 4.7 MFC创建的完整应用程序实例 小结 第5章 菜单与加速键 5.1 消息与事件 5.1.1 事件驱动机制 5.1.2 消息和消息映射 5.1.3 消息处理过程 5.2 菜单和加速键的创建 5.2.1 菜单的创建 5.2.2 加速键的创建 5.3 添加菜单所需的处理函数 5.3.1 添加普通菜单的处理函数 5.3.2 添加弹出式菜单的处理函数 5.4 加载加速键 小结 第6章 AppWizand和ClassWizard 6.1 一个简单应用程序的创建 6.1.1 MFCAppWizard 6.1.2 ClassWizard 6.1.3 程序实例 6.2 程序调试 6.2.1 创建调试实例程序 6.2.2 调试器 小结 第7章 在WindOWS中绘制图像 7.1 绘图的基础知识 7.1.1 映射模式 7.1.2 设备上下文 7.2 图形设备接口(GDI) 7.2.1 设备环境类(CDC) 7.2.2 GDI对象 7.3 简单图形的绘制 7.3.1 屏幕绘图的主要函数 7.3.2 图形绘制基本原则 7.3.3 画笔 7.3.4 画刷 小结 第2篇 关键控件篇(MFC) 第8章 常用界面控件 8.1 静态文本(staticText)控件 8.1.1 传统控件通知消息 8.1.2 静态控件的使用 8.1.3 CStatic类的主要成员函数 8.2 文本编辑(EditBox)控件 8.2.1 文本编辑控件的使用 8.2.2 CEdit类的主要成员函数 8.3 滚动条(ScroUBar)控件 8.3.1 滚动条控件的使用 8.3.2 CScrollBar类的主要成员函数 8.4 按钮控件 8.4.1 按钮控件的使用 8.4.2 CButton类的主要成员函数 8.5 列表框(List:Box)控件 8.5.1 列表框控件的使用 8.5.2 ClistBox类的主要成员函数 8.6 组合框(Combobox)控件 8.7 图片(Picture)控件 8.8 列表(ListCtrl)控件 8.8.1 Win32新型控件概述 8.8.2 列表控件的使用 8.8.3 ClistCtrl类的主要成员函数 8.9 树形(TreeCtrl)控件 8.9.1 树形控件的使用 8.9.2 CTreeCtrl类的主要成员函数 8.9.3 树形控件的通知消息 8.10 项卡(TabCtrl)控件 8.10.1 选项卡控件的使用 8.10.2 选项卡控件通知消息 8.10.3 选项卡控件的使用 8.11 用实例:进制转换计算器 8.11.1 进制转换计算器功能概述 8.11.2 实例具体实现步骤 小结 第9章 文本和字体类 9.1 基础知识介绍 9.2 CFont类 9.3 文本输出过程 9.4 字体和文本输出实例 9.5 根据数据绘制相应的柱状图 9.6 根据坐标绘制三角形 小结 第10章 对话框 10.1 对话框的创建 10.1.1 对话框的

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧