如何在DLL中创建SDI/MDI

cjblove2008 2009-08-23 04:43:50
如何在DLL中创建SDI/MDI,这个问题搞了好久了,一直没实现,希望哪位大侠帮帮忙。

主程序只提供一个接口函数,具体参数我可以增加修改,其他代码不能动。

主程序也是一个SDI,希望调用DLL后生成另外一个SDI或者MDI,情况就这样

谁能提供具体步骤和代码最好,先谢谢了!
...全文
343 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
cjblove2008 2012-07-24
  • 打赏
  • 举报
回复
不好意思,几年前的问题了,代码我都已经找不到了,将这个帖子看完,按照这个思路自己想想办法吧,我都很久没碰VC了。
sragh1015 2012-07-22
  • 打赏
  • 举报
回复
楼主,我最近工作中也遇到了这样的问题,能把代码发我下么?我邮箱sragh@163.com
qjiam 2011-04-14
  • 打赏
  • 举报
回复
楼主我很需要你的单文档做动态链接库啊!!!我是菜多指点啊QQ:1139598231加我啊
toryln 2010-02-04
  • 打赏
  • 举报
回复
楼主,你最后是怎么搞出来的啊?给我个demo吧,我现在也很急
cjblove2008 2009-11-03
  • 打赏
  • 举报
回复
差点忘结贴了 自己把它搞出来了
我是苦力 2009-08-26
  • 打赏
  • 举报
回复
在DLL中创建SDI/MDI,自己在dll中创建SDI/MDI,为什么还要保留那些模板的呢.这些个可以去掉.
至于窗口不见了,你加一下语句:
CMainFrame* pFrame = new CMainFrame(/*m_pProject*/); //-- 你的Frame不要再模板中创建了.
m_pMainWnd = pFrame;
pFrame->LoadFrame(IDR_MAINFRAME,WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL, NULL);
pFrame->ShowWindow(SW_SHOWMAXIMIZED);
pFrame->UpdateWindow();
pFrame->InitialFrame();

想实现复杂功能,又想简单的实作,这个很矛盾.
你说的功能,不是改这么一个两个地方可以实现的.连模板都不丢,自己又搞Doc和View也矛盾.
你在DLL里面的View需要接受到MainFrame的消息并能相应,你的View要能访问到Doc.建议做一个叫Project的顶级指针,可以通过它访问到所有一切.
cjblove2008 2009-08-26
  • 打赏
  • 举报
回复
我用这个方法:

BOOL CSDIMain::InitInstance() //InitInstance()被我换成导出函数了
{
// 创建模板

CMultiDocTemplate *m_pTemplate;
m_pTemplate = new CMultiDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CSDIForTestDoc),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CSDIForTestView));

CSDIForTestDoc* pDocument = new CSDIForTestDoc;
// 创建新的frame
CFrameWnd* pFrame = m_pTemplate->CreateNewFrame(pDocument, NULL);
if (NULL == pFrame)
{
AfxMessageBox("Create frame failed");
return FALSE;
}
m_pTemplate->InitialUpdateFrame(pFrame, pDocument);
return TRUE;
}

现在的问题是,生成的窗口只会闪一下就没了。这我明白函数结束了,窗口自然消失了。我想在这个导出函数中开启新线程,好让窗口不消失,还能实现消息循环,该怎么办???
cjblove2008 2009-08-26
  • 打赏
  • 举报
回复
执行到m_pMainWnd = pFrame的时候报错(unhandled exception),以前也这么试过,没成功过。我接触VC时间不长,好多问题不明白,楼上说的要动好多地方,能不能介绍下思路,我好按照思路来做,当然如果你能做个简单的只要通过导出函数创建一个简单的SDI的代码那就最好了 ,本人感激不尽。
我是苦力 2009-08-25
  • 打赏
  • 举报
回复
除了消息的管理,还有就是工程结构和接口结构的管理.
如果以上三个部分搞透彻了就比较简单了.
我是苦力 2009-08-25
  • 打赏
  • 举报
回复
数据可以有一个专门负责数据的DLL管理,这样你以后想增加功能就往DLL目录丢DLL就可以了.模块分配也简单.
除了消息的管理,还有就是工程结构和接口结构的管理.
我是苦力 2009-08-25
  • 打赏
  • 举报
回复


if(!g_View.Create(NULL, NULL,AFX_WS_DEFAULT_VIEW | WS_HSCROLL | WS_VSCROLL ,
CRect(0,0,0,0), CFrameWnd::FromHandle(m_pFrameCtrl->GetFrameWnd()), AFX_IDW_PANE_FIRST))
return FALSE;

g_View 继承CView, 在DLL中执行. 第五个参数相当于MainFrame.
这个View的所有OnUpdate 和 Command 等消息需要在mainFrame中剥离,然后自己路由到DLL中.这样每个DLL可以维护一个View,Document的管理可以通过接口来管理,随便你写在哪里.
好处是,如果你想增加一个View,就可以丢一个DLL在一个约定的目录,这个DLL的接口也需要是约定的.大家保持一致.
cjblove2008 2009-08-25
  • 打赏
  • 举报
回复
高手都到哪去了,帮帮忙啊,急啊
gfynew 2009-08-24
  • 打赏
  • 举报
回复
不懂,关注ing
cjblove2008 2009-08-24
  • 打赏
  • 举报
回复
没人这么做过吗?
蒋晟 2009-08-23
  • 打赏
  • 举报
回复
什么样的代码需要重用?要把文档模板搬到DLL里面去的话,最好把app也搬到里面去
MoXiaoRab 2009-08-23
  • 打赏
  • 举报
回复
CWinApp和CFrameWnd的实例对象通过接口函数传递到DLL中一点意思都没有。你没有自己那个派生类的申明,而且就算声明了,拿到了指针你能干嘛呢?
cjblove2008 2009-08-23
  • 打赏
  • 举报
回复
我是相当于将一个SDI的所有功能,在DLL中实现,之后通过一个主程序直接调用DLL完成这个SDI的功能,这样做的话主程序不单单可以完成这个SDI所以功能,还能调用其他DLL完成其他功能。
cjblove2008 2009-08-23
  • 打赏
  • 举报
回复
我现在在想,是不是主程序(SDI)的 CWinApp和CFrameWnd的实例对象需不需要通过接口函数传递到DLL中,传过去后又该如何使用呢,这些我不是很明白,请大哥大姐指点下。
MoXiaoRab 2009-08-23
  • 打赏
  • 举报
回复
太复杂了...非要这么做不可?
cjblove2008 2009-08-23
  • 打赏
  • 举报
回复
4楼的朋友给的资料,我也按这种方式做过,但是没有成功,就是在
CFrameWnd* pFrame = m_pTemplate->CreateNewFrame(pDocument, NULL);的时候没有执行成功,
pFrame为空。

BOOL CSDIMain::InitInstance()
{
// 创建模板
if(m_pTemplate == NULL)
{
m_pTemplate = new CMultiDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CSDIForTestDoc),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CSDIForTestView));
}

CSDIForTestDoc* pDocument = new CSDIForTestDoc;
// 创建新的frame
CFrameWnd* pFrame = m_pTemplate->CreateNewFrame(pDocument, NULL);
if (NULL == pFrame)
{
AfxMessageBox("Create frame failed");
return FALSE;
}

m_pTemplate->InitialUpdateFrame(pFrame, pDocument);

return TRUE;
}
加载更多回复(4)
注意,这是未完成版本!!! 由于作者工作原因,暂时没有时间完成,但是基本功能已经实现,有个小问题如果你解决了欢迎发送给我,谢谢! 请用VS2010打开。内含四个DLL工程,及一个DLL 的测试工程。 其一个问题是,打开子窗口之后子窗口内容没有显示,单击子窗口客户区之后其内容才显示,目前作者没有解决。 /************************************************************************/ /* MdiPlus框架说明 */ /************************************************************************/ /** 项目名称: MdiPlus框架 版本号: v1.0.1 第一作者: Jef 地址: 国/江苏 日期: 20100616 电子邮箱: dungeonsnd@126.com 版权: 1.本框架完全开源。您可以免费使用本程序,但在用于商业用途前请获得第一作者的许可。 2.您使用本程序而导致任何伤害以及经济损失,由过错方依法承担所有责任, 一概与第一作者及合作单位无关。 3.如果您使用本程序则表示您已经同意此版本协议!否则请勿使用! 项目功能: MdiPlus框架是在Windows平台下把SDI程序行为与MDI程序行为结合在一起的编程手段。 框架最适合: a.以GDI方式输出为主的应用程序。 b.需要多种文档模板输出的MDI程序。 c.需要一个类似于SDI应用程序的固定(禁止改变大小)的View进行绘图。 框架充分进行模块化,把MDI的窗口创建类放在一个单独的DLL(DllMdiWnd.dll),开发者应该继承 这个类来得到一个文档模板(这样继承者不必考虑创建细节,只负责绘图),并且每一个文档模板最好 放到一个DLL(如ADoc.dll,BDoc.dll,CDoc.dll)。开发者建立主程序来调用ADoc.dll,BDoc.dll, CDoc.dll,每个文档模板(如ADoc.dll)可产生多个对应子窗口。 不过,DllMdiWnd.dll并没有提供view/doc支持,它的职责只是创建及销毁调用者的需要子窗口。 (如果子窗口是new创建出来的,ADoc.dll的基类CMdiPlus自己会负责delete,开发者可以不调用 delete)。 当然,如果有必要你可以在DLL(A.dll,B.dll,C.dll)实现view/doc支持。建议根据 需要开发独立的数据模型模块。 如果按照MVC模式的划分,DllMdiWnd.dll可以理解为C(控制器,创建与销毁窗口),继承类(如ADoc.dll, BDoc.dll,CDoc.dll)类似于V(视图,负责显示数据),这个框架没有提供M(模型,数据存储)。开发者 应该结合不同的文档模板来实现M。 版本历史: v1.0.1 20100616 第一版本 如何使用: 方法1. 进行项目开发时先建立DLL工程(建议选择 add mfc header win32 dll),然后把 DllMdiWnd.dll拷贝到新建项目。根据应用需要的不同文档模板建立多个对应的Dll工程,这些Dll 都继承自DllMdiWnd.dll的导出类,假定为ADoc.dll,BDoc.dll,CDoc.dll,这些Dll隐式链接DllMdiWnd.dll。 接着建立支持doc/view类型的MDI MFC主程序工程,隐式链接ADoc.dll,BDoc.dll,CDoc.dll。 另外要特别注意的是,主程序要进行必要的修改,如CChildFrame要修改窗口样式。建立的MDI 主程序运行过程将完全类似于SDI程序。如,弹出子窗口时它的视图仍然保持最大化(普通的MDI应用 程序任意一个子窗口从最大化还原时,其它窗口都将处于非最大化状态),并且它永远处于弹出的 子窗口下面,只能(且必须)建立一个CChildFrame。主程序的所有绘图工作都在这个 CChildFrame对应的view上进行。如果需要调用子窗口,只需要创建ADoc.dll(或BDoc.dll,CDoc.dll)导 出类的对象即可。子窗口的所有绘图工作都在ADoc.dll(或BDoc.dll,CDoc.dll)实现,所以主程序与 ADoc.dll(或BDoc.dll,CDoc.dll)应该同时开发。 方法2. 开发者可以自己根据需要直接修改Demo版进行开发。 其它: 框架有点类似于多个文档模板的MDI应用程序,但是普通的MDI程序在新建一个文档前无法绘图,除非 子类化CMainFrame或截获CMDIClient的消息。这些方式不便进行模块化开发。MdiPlus框架主要优点是在 新建一个文档前就有一个View进行绘图,并且不同功能进行模块化,各模块放到Dll(如果必要,你也 可以直接写成静态库链接到最终的执行程序里),适合一个项目多人同时进行开发。 **/
压缩包 MdiPlus_WS_POPUP 是正确的示例; Failure Samples是错误示例,演示了其它方法来创建此类多窗口程序失败例子。 综合比较使用MdiPlus_WS_POPUP是一种比较好的手段。 ============================== /************************************************************************/ /* MdiPlus框架说明 */ /************************************************************************/ /** 项目名称: MdiPlus框架 版本号: v1.0.3 第一作者: Jef 地址: 国/江苏 日期: 20100825 电子邮箱: dungeonsnd@126.com 版权: 1.本框架完全开源。您可以免费使用本程序,但在用于商业用途前请获得第一作者的许可。 2.您使用本程序而导致任何伤害以及经济损失,由过错方依法承担所有责任, 一概与第一作者及合作单位无关。 3.如果您使用本程序则表示您已经同意此版本协议!否则请勿使用! 项目功能: MdiPlus框架是在Windows平台下把SDI程序行为与MDI程序行为结合在一起的编程手段。 框架最适合: a.以GDI方式输出为主的应用程序。 b.需要多种文档模板输出的MDI程序。 c.需要一个类似于SDI应用程序的固定(禁止改变大小)的View进行绘图。 版本历史: v1.0.1 20100616 第一版本 v1.0.2 v1.0.3 20100825 整理了不同方案,选择一种比较好的方案。 其它: 框架有点类似于多个文档模板的MDI应用程序,但是普通的MDI程序在新建一个文档前无法绘图,除非 子类化CMainFrame或截获CMDIClient的消息。这些方式不便进行模块化开发。MdiPlus框架主要优点是在 新建一个文档前就有一个View进行绘图,并且不同功能进行模块化,各模块放到Dll(如果必要,你也 可以直接写成静态库链接到最终的执行程序里),适合一个项目多人同时进行开发。 **/

15,473

社区成员

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

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