高手看过来!如何以最小的代价把基于文档、视图的程序转到动态链接库中? 高手们都哪去了呀。版主、prog_st、vcmfc什么的,你们都去哪了?相信这个问题是程序设计中普遍存在的一个问题,大家研究一下如何解决? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 回:zeroweb(我不想再做软件了) 对,这就需要大家不要吝啬,积极讨论了! 对,这是普遍的问题,余在网上撒了大把网,还是没碰到大牛,不过,相信是比较easy的事。首先在DLL文件中添加做好的类文件,然后在要导出的类和函数前加定义语句,至于其它地方怎么写,现在还不是很清楚,比如DLL文件的.h文件要不要动?导出类中的函数,在vb中怎么调用?这都是很让人pp的事,很希望大家(尤其是高手大牛们)热情参与讨论,给余们托起一颗指路星星来,呵呵,期待大家! 回: solarlee(清早跑步的鸟) 生成DLL大多数书上都有的,可以参考一下。我目前的问题主要集中在,在DLL中能否基于文档、视图进行开发程序。 能,可以用Regular DLL,把资源都封装到DLL里,就通过一个函数比如void OpenXXWindow()之类的接口调用,这样做很显然因为用了Regular DLL 所以可以被其他语言调用 更正一下,看了看我的源代码,使用的是Extern DLL,Regular DLL能不能用不能确定,例子如下举例:下面的函数就是一个DLL接口函数void OpenChildWindow(){ HINSTANCE t_hInstOld = AfxGetResourceHandle(); AfxSetResourceHandle(TestDLL.hModule);//设置资源句柄,在doc/view处理时都要考虑到资源的问题,可能会和主程序的资源发生冲突//资源冲突可以通过设置和释放资源句柄来实现,但是消息号就不大好处理,//建议整个应用统一分配消息号,有些消息号可以做成共享资源,在各个模块之间共享,//就象IDOK,IDCANCEL一样 CDocTemplate*pDocTemp; POSITION p=AfxGetApp()->GetFirstDocTemplatePosition(); CString text; BOOL HasFound=FALSE; while(p!=NULL) { pDocTemp=AfxGetApp()->GetNextDocTemplate(p); pDocTemp->GetDocString(text,CDocTemplate::filterName); if(text==DOCFILTERNAME)//DOCFILTERNAME是个宏,代表一个字符串 { HasFound=TRUE; break; } } if(!HasFound) { CMultiDocTemplate* pDocTemplate; pDocTemplate = new CMultiDocTemplate( IDR_MANAGER, RUNTIME_CLASS(CXXDoc), RUNTIME_CLASS(CXXWnd), RUNTIME_CLASS(CXXView));//这是DLL中定义好的三个类 AfxGetApp()->AddDocTemplate(pDocTemplate); pDocTemp=pDocTemplate; } CMDIFrameWnd* pMainWnd=(CMDIFrameWnd*)AfxGetMainWnd(); /* BOOL bNew=TRUE;//g_pToolBar是个公有变量,初始化为NULL if(g_pToolBar!=NULL) if(::IsWindow(g_pToolBar->m_hWnd)) bNew=FALSE; if(bNew) { g_pToolBar=new CToolBar; g_pToolBar->m_bAutoDelete=TRUE; CToolBar& wndToolBar=*g_pToolBar; if (!wndToolBar.CreateEx(pMainWnd,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP |CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC) || !wndToolBar.LoadToolBar(IDR_MANAGERTOOLBAR)) TRACE0("Failed to create toolbar\n"); else { wndToolBar.EnableDocking(CBRS_ALIGN_ANY); pMainWnd->EnableDocking(CBRS_ALIGN_ANY); pMainWnd->DockControlBar(&wndToolBar); } }*///上面一端是使用Toolbar,这里没有用ToolBar pDocTemp->OpenDocumentFile(NULL);AfxSetResourceHandle(t_hInstOld);//释放资源句柄} 回 : voidman() 你好象把CWinApp 初始化的代码,拉到自己的函数中,手工写了出来!现在的问题还只是单文档的,你如果用多文档都没有问题,我起单文档应该不会有什么问题的,我试试看。 主要是资源的问题,如果你的主应用和DLL中相同的资源号,比如有相同的Dialog号,不加那两句就可能出现资源冲突的问题(具体的表现是你想打开这个对话框时打开的是另一个)。麻烦的是消息号,比如菜单对应的消息,比如你的toolbar有一个消息和主应用的一个菜单消息号的值相等,你打开你的doc/view的实例,点击toolbar上的按钮,就可能触发主程序的函数,这不是你所希望的(在你的实例没有焦点的时候消息就会往上传到主应用),当然toolbar有个函数SetOwner可以指定消息具体发给某个窗口,在单文档中已经没有问题了,但是在多文档中,有一个模板可能有多个实例,就不能把toolbar绑定到某一个固定的窗口上,所以还得进一步处理,比较简单的方法就是各个模块协调,不要出现相同值的消息号,但是这样做有背于模块化的程序设计思想,增加了模块间的偶合,但是我还没找到好方法来解决,看看那位大侠能解决。 回: voidman() 我想在程序中使用工具条和状态条,你的示例程序编译后不能运行错误在 wndToolBar.EnableDocking(CBRS_ALIGN_ANY);执行时,能不能把你完整的程序发给我一份,我的EMAIL是 : [email protected]如果有单文档的例子就更好了!谢谢! 回复: voidman() 谢谢你!我的程序是Ext Dll ,现在也可以使用了!出错的错误,不是你的程序问题,是因为我的程序中使用了,AfxGetMainWnd()函数,此函数调用会用于主程序的窗口,而不是我期望的框架窗口,因此我把它改为 GetParentFrame()就可以了!而且还有一点,框架窗口的工具栏都不需要在这个函数里创建,为原来的方式一样就可以了!我现在要给分了!不知有没有别的方法了! WTL图片控件的鼠标焦点事件 在MFC下, 想做一个1200X2800的大BITMAP图像 位图扭曲算法,大家发表意见 AfxOleInit()异常的问题 一小段代码,请帮忙分析 关于CListCtrl的问题,在线!!! ATL做控件,WM_NOTIFY消息如何处理? MFC两个矩形判断交集 通过Modem拨号到一台机器。。。高手请进,有分送!!!!! MFC中字符环境问题 vc++的spawning错误是什么??会事?? 300分大讨论:QQ窗口是不是AppBar?AppBar是不是宽度一定要和屏幕宽度相同?如何实现AppBar?
对,这就需要大家不要吝啬,积极讨论了!
,呵呵,期待大家!
生成DLL大多数书上都有的,可以参考一下。我目前的问题主要集中在,在DLL中能否基于文档、视图进行开发程序。
举例:
下面的函数就是一个DLL接口函数
void OpenChildWindow()
{
HINSTANCE t_hInstOld = AfxGetResourceHandle();
AfxSetResourceHandle(TestDLL.hModule);
//设置资源句柄,在doc/view处理时都要考虑到资源的问题,可能会和主程序的资源发生冲突
//资源冲突可以通过设置和释放资源句柄来实现,但是消息号就不大好处理,
//建议整个应用统一分配消息号,有些消息号可以做成共享资源,在各个模块之间共享,
//就象IDOK,IDCANCEL一样
CDocTemplate*pDocTemp;
POSITION p=AfxGetApp()->GetFirstDocTemplatePosition();
CString text;
BOOL HasFound=FALSE;
while(p!=NULL)
{
pDocTemp=AfxGetApp()->GetNextDocTemplate(p);
pDocTemp->GetDocString(text,CDocTemplate::filterName);
if(text==DOCFILTERNAME)
//DOCFILTERNAME是个宏,代表一个字符串
{
HasFound=TRUE;
break;
}
}
if(!HasFound)
{
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(
IDR_MANAGER,
RUNTIME_CLASS(CXXDoc),
RUNTIME_CLASS(CXXWnd),
RUNTIME_CLASS(CXXView));
//这是DLL中定义好的三个类
AfxGetApp()->AddDocTemplate(pDocTemplate);
pDocTemp=pDocTemplate;
}
CMDIFrameWnd* pMainWnd=(CMDIFrameWnd*)AfxGetMainWnd();
/* BOOL bNew=TRUE;
//g_pToolBar是个公有变量,初始化为NULL
if(g_pToolBar!=NULL)
if(::IsWindow(g_pToolBar->m_hWnd))
bNew=FALSE; if(bNew)
{
g_pToolBar=new CToolBar;
g_pToolBar->m_bAutoDelete=TRUE;
CToolBar& wndToolBar=*g_pToolBar;
if (!wndToolBar.CreateEx(pMainWnd,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP
|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC) ||
!wndToolBar.LoadToolBar(IDR_MANAGERTOOLBAR))
TRACE0("Failed to create toolbar\n");
else
{
wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
pMainWnd->EnableDocking(CBRS_ALIGN_ANY);
pMainWnd->DockControlBar(&wndToolBar);
}
}*/
//上面一端是使用Toolbar,这里没有用ToolBar
pDocTemp->OpenDocumentFile(NULL);
AfxSetResourceHandle(t_hInstOld);//释放资源句柄
}
你好象把CWinApp 初始化的代码,拉到自己的函数中,手工写了出来!
现在的问题还只是单文档的,你如果用多文档都没有问题,我起单文档应该不会有什么问题的,我试试看。
我想在程序中使用工具条和状态条,你的示例程序编译后不能运行
错误在 wndToolBar.EnableDocking(CBRS_ALIGN_ANY);执行时,
能不能把你完整的程序发给我一份,我的EMAIL是 : [email protected]
如果有单文档的例子就更好了!谢谢!
谢谢你!
我的程序是Ext Dll ,现在也可以使用了!
出错的错误,不是你的程序问题,是因为我的程序中使用了,AfxGetMainWnd()函数,此函数调用会用于主程序的窗口,而不是我期望的框架窗口,因此我把它改为 GetParentFrame()就可以了!
而且还有一点,框架窗口的工具栏都不需要在这个函数里创建,为原来的方式一样就可以了!
我现在要给分了!不知有没有别的方法了!