如何在DLL中创建SDI/MDI

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

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

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

谁能提供具体步骤和代码最好,先谢谢了!
...全文
339 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)

15,473

社区成员

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

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