您的位置:程序门 -> vc/mfc -> 进程/线程/dll



从扩展dll中导出对话框时的资源切换问题


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


从扩展dll中导出对话框时的资源切换问题
发表于:2008-01-11 00:57:28 楼主
在一mfc扩展dll中生成一个对话框资源,id为idd_dialog1,对应的对话框类为cdlldlg,并在其中添加多个不同的资源,定义了多个接口函数,并在cdlldlg前加afx_exe_class导出该类。在一个.exe中调用该对话框,生成一个模态对话框。
void   cmydlg::func()
{
    cdlldlg   dlg;
      dlg.domodal();
}
运行发现有错误,提示说idd_dialog1未定义。根据网上介绍的一种方法,在dll中注销掉enum   {   idd   =   idd_dialog1   };这一行,并将对话框构造函数改为
cdlldlg::cdlldlg(cwnd*   pparent   /*=null*/):   cdialog(idd_dialog1,   pparent)
运行显示正确。我的问题是
 
1.这种方法是否可靠,还有没有别的方法?
2.从扩展dll中导出对话框是不是就不需要切换资源状态了?因为我没切换也没发现有什么问题。

当我在.exe中将dll中的对话框导出,并生成非模态对话框时,代码如下
void   cmydlg::func()
{
                  cdlldlg*dlg=null;
dlg=new   cdlldlg;
dlg-> create(idd_dialog1,this);     //此行出错
dlg-> showwindow(sw_show);
}
运行保错,提示说idd_dialog1未定义,然后我修改代码
void   cmydlg::func()
{
                hinstance   hexeins=afxgetinstancehandle();
hinstance   hdllins=getmodulehandle("dllex.dll");
afxsetresourcehandle(hdllins);

cdlldlg*dlg=null;
dlg=new   cdlldlg;
dlg-> create(idd_dialog1,this);
dlg-> showwindow(sw_show);

afxsetresourcehandle(hexeins);
}
可还是不行,我已经切换资源了呀。我有些糊涂了,请高手指教,从扩展dll中导出非模态对话框时该怎么操作才不会出错,就以我这个例子修改就成。多谢。
发表于:2008-01-11 12:14:071楼 得分:0
怎么没人啊?自己顶一下
发表于:2008-01-11 13:15:562楼 得分:0
idd_dialog1是定义在dll项目的resource.h里面的,exe项目当然找不到这个定义,要么也添加这个文件的包含,要么在dll的导出类中重写create函数,把idd_dialog1这个参数隐藏起来,然后这样调用   dlg-> create(this)
发表于:2008-01-11 13:49:463楼 得分:0
利用jameshooo说的方法,我解决了生成非模态对话框时idd_dialog1未定义的问题,可是当我在.exe中通过按钮打开一个.exe中定义的对话框时,结果显示的是.dll中的那个对话框,显然,这是资源没能正确切换导致的。可我在调用.dll中的对话框的函数里已经切换过资源了啊。
void       cmydlg::func()  
{  
      hinstance       hexeins=afxgetinstancehandle();                      
      hinstance       hdllins=getmodulehandle("dllex.dll");  
      afxsetresourcehandle(hdllins);                                           //设置当前资源为.dll

      cdlldlg*dlg=null;  
      dlg=new       cdlldlg;  
      dlg->   create(this);                   //在dll中重载   create函数,隐藏idd_dialog1
      dlg->   showwindow(sw_show);  

      afxsetresourcehandle(hexeins);                                     //调用完成后设置当前资源为.exe  
}  

问题出在哪里呢?
发表于:2008-01-11 14:11:094楼 得分:0
不用切换资源,只有在dll导出函数里才需要切换资源
发表于:2008-01-11 14:15:405楼 得分:0
那为什么我两次显示的对话框是同一个呢?很明显出现了问题。而且我dll中的对话框和.exe中的对话框id名和值都不一样。按说应该分别显示自己的对话框才对。
发表于:2008-01-11 14:27:026楼 得分:0
第二次怎么调用的?
发表于:2008-01-11 14:31:527楼 得分:0
现在好了,能正常显示了,莫名其妙的一个问题。
是不是只要是扩展dll中导出对话框,无论是模态还是非模态,都不需要切换资源。
发表于:2008-01-11 16:07:058楼 得分:0
还有一个问题,就是当提示idd_dialog1未定义时,我在dll中cmydlg类的头文件中包含#include   "resource.h",可运行还是提示说未定义,这是为什么?


快速检索

最新资讯
热门点击