DLL中的资源问题,高手请进!

puzzle 2000-09-11 06:56:00
希望实现这样的功能:
一个很大的应用程序,部分功能模块可能会经常升级。
要在dll中实现所有的功能,dll的调用者只负责提供框架。
在dll中加载了所需要的资源,但有问题。
第一:不同模块之间的数据可能在配置时需要相互对照,而且
提交顺序随意,所以在dll中提供的对话框采用无模式方式。但
该对话框总是一闪就马上消失。为什么?
我用的是CCustomDlg dlg;
dlg.Create();
dlg.ShowWindow();
dlg.Update();之类的方式。
第二:于是我偷懒,用添加组件的方法直接添加属性页到工程,
位置在Visual C++ Components-->Property Sheet,使用无模
式方式,然后将对话框的属性为alwaysontop一类的属性,这样
就可以同时加载多个不同dll中的资源。但又出现了问题。我无法
在属性页的窗口中添加OLE控件(我的表达可能不正确),换句话
说,只要我向属性页中添加Registered ActiveX Controls,我
添加了控件的属性页的对话框就会在运行时从ProperitySheet中
消失。这又是为什么?
第三:
能够向直接向调用程序通过出口函数传递子窗口?
思路是这样:调用程序通过引用参数的形式从dll中获取创建子窗口的
值,多文档界面的程序中不是有这样的语句:
m_pDocTempLanIp = new CMultiDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CCusDoc), // document class
RUNTIME_CLASS(CFrameChild), // frame class
RUNTIME_CLASS(CCusView)); // view class
我在dll新建的三个类,分别派生于CDocument, CMDIFrame,CView,
但是最终的结果是非法操作!
我现在想哭,真的不应该期望什么都能够在dll中实现,但我现在遇到
这些问题相信肯定有高手曾经解决。

可能有些罗嗦,我再总结一下我的问题:
1.无模式对话框在dll中怎样实现?
2.自动生成的属性页为什么不能加载ActiveX控件?
3.能否通过dll传递创建子窗口所需要的参数给调用程序?如果能,怎样做?
为什么?

敬请关注!!
...全文
235 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dlf 2000-09-12
  • 打赏
  • 举报
回复
3.在《Visual C++ 6宝典》有一个很好的例子,可以做成常规DLL
BOOL CImageViewer::Init()
{
BOOL bSuccess = FALSE;

CWinApp* pApp = AfxGetApp();
ASSERT(pApp);
if (pApp)
{
CMultiDocTemplate* pDocTemplate;

pDocTemplate = new CMultiDocTemplate(
IDR_IMAGEDOCTYPE,
RUNTIME_CLASS(CImageViewerDoc),
RUNTIME_CLASS(CMDIChildWnd),
RUNTIME_CLASS(CImageViewerView));

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

return bSuccess;
}
在DLL中做Doc,view等用init作为输出函数,在程序中调用。
puzzle 2000-09-12
  • 打赏
  • 举报
回复
Jackzhu,多谢指导!
现在属性页是不消失了,但是该activex控件还是不显示。
puzzle 2000-09-12
  • 打赏
  • 举报
回复
多谢回复!
我再补充说明一下第二点!
我使用appwizard创建dll工程,所选用的模板是regular dll with
MFC statically liked。
然后,从菜单中依次选择的顺序为project->add to project->conponent
and controls->Visual C++ Components->Property Sheet,在插入控件
后,会弹出一个对话框,让你选择建立属性页还是wizard。
我选择属性页,next之后在下一个对话框中modeless选项中选yes。接受缺
省选项,最后finish。
这样,可以在dll中提供一个可以用无模式方式显示的属性页。在调用程序
中调用该dll中并没有问题,但当我再做下面的操作以后就出现了问题。
再从菜单中选择project->add to project->conponent and controls->
Registered ActiveX Controls->Microsoft FlexGrid Control, version
6.0,将该控件插入资源下面表示属性页的对话框中,则运行时该插入activex
控件的属性页消失。如果我在所有的属性页中都插入activex控件,则显示的
属性页中将只显示最后一个属性页面,而且插入的控件并不显示,我想知道如
何解决。
按照您的提示,第一个问题已经解决。
第三个问题能否提供更具体一点的思路,如有源代码最好,谢谢!
Jackzhu 2000-09-12
  • 打赏
  • 举报
回复
2 你没有初始化 AfxEnableControlContainer() 所以你的对话框无法容纳activex控件
3
坎坷的菜贩 2000-09-12
  • 打赏
  • 举报
回复
1.同意holly,应该是局部变量的问题
ufc 2000-09-12
  • 打赏
  • 举报
回复
可能是由于在区域内定的CCustomDlg g_dlg,出了该函数g_dlg会被注销,其它DLL的例子请
查看MSDN的SAMPLE里的DLLHUSK和DLLTRACE,它说的很详细
Holly 2000-09-12
  • 打赏
  • 举报
回复
Dlf提供的代码是可用的,不过如果你还有非法操作,需要你提供非法操作的具体提示,而且最好提供在Debug调试状态下的非法操作时的调用堆栈和哪一行代码导致的非法操作!
Holly 2000-09-11
  • 打赏
  • 举报
回复
1.看起来你的问题是CCustomDlg dlg;的变量是局部变量的问题,生命期有限!应当将Dialog变量声明为生命期较长的比如全局变量(依附于某个全局变量类的成员也可)
CCustomDlg g_dlg;
2.没明白!
3.肯定是可以,但DLL必须是扩展DLL(因为你传递的指针是MFC的类的实体);

2,586

社区成员

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

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