none
MFC开发.ocx控件的问题--希望高手进来看一看 RRS feed

  • 问题

  •  

        条件:  我用MFC开发的带界面的Activex控件a,在界面上有一个按钮,点击按钮弹出一个对话框c; 然后又开发了一个带界面控件b,在控件b界面上有个按钮,点击按钮将弹出一个对话框d,对话框d中使用了控件a。 

       这是我来使用控件b,即点击界面上的按钮,弹出对话框d,在点击控件a上的按钮,弹出对话框c, 然后切换一下程序,这是来关闭对话框c就会崩掉。并且奇怪的是我用dubug版的就会崩,release就不会崩。

      请高手帮忙解释一下这里的原因? 谢谢。

    2008年11月21日 11:31

答案

全部回复

  • 一般来说ActiveX中不应弹出对话框。如果弹出对话框,应该在弹出之前通知容器(PreModalDialog,PostModalDialog),这样如果容器支持ActiveX中弹出对话框,可以做相应的处理。
    如果要弹出对话框,应该遵守模态对话框的规则,即后
    弹出的应该先被关闭。如果你的代码允许先弹出的在后弹出的之前关闭,那么你的窗口过程堆栈会被损坏,你的程序会有不可预料的行为。
    2008年11月21日 15:36
    版主
  • 您好,您可能没有理解我的意思,可能是我写的比较笼统。

    我把代码粘过来会比较容易理解:

    axtivex_1:

    在带界面的控件1OnCreate函数里添加m_mainDlg.Create(IDD_MAINDLG1,this);   m_mainDlg.ShowWindow(TRUE); 

    m_mainDlg对话框的样式是Style:Child、Border:None,其他保持默认。

    在这个对话框中有一个按钮,按钮实现BN_CLICKED事件,按钮的功能是点击他探出一个对话框,具体实现CchildDlg m_child;   m_child.DoModal();

     

    activex_2:

    带界面控件2的实现和控件1一样,也是在OnCreate函数里添加m_mainDlg2.Create(IDD_MAINDIG2,this);   m_mainDlg2.ShowWindow(TRUE); 

    m_mainDlg2对话框的样式是Style:Child、Border:None,其他保持默认。

    在这个对话框中也有一个按钮,按钮实现BN_CLICKED事件,按钮的功能也是点击他弹出一个对话框,具体实现CchildDlg2 m_child2;   m_child2.DoModal();    与前边一个CchildDlg不同的是,CchildDlg2对话框里使用了控件1。

     

    这时我来写个测试程序来使用控件2  ,当操作一直弹出控件1的CchildDlg后,这是切换一下程序后再回来关闭CchildDlg,程序就甭掉了

     

     

    具体的情况就是这样了,你能具体的帮我解释一下吗?是我程序的原因还是其他的原因?

    2008年11月23日 11:45
  • 没有看到你那里遵守了弹出模态对话框的规则。
    2008年11月23日 14:15
    版主
  • “如果要弹出对话框,应该遵守模态对话框的规则,即后弹出的应该先被关闭。“ 你的这话很明显的, 用DoModal() 一层调用一层,最后弹出的当然先关闭阿,想关闭先打开的对话框也不可能阿。今天我试了一下你所说的PreModalDialog和PostModalDialog但还是不起作用啊,你如果有时间自己照着我的描述写两个activex控件,我询问了好多高手,大部分人说的mfco42d.dll库本身存在的问题,我在网上找了一下关于带界面控件的开发技术,但按照他们那样去做一个控件还是不行。你那有关于带界面控件的开发技术文档马?如果有的话,能不能贴出来,谢谢。

    2008年11月24日 14:36
  • 或者你把你的邮箱告诉我,我把我的测试程序给你发过去,你有时间调试以下,看看问题

     

    2008年11月24日 14:42
  • 2008年11月24日 20:03
    版主
  •  

    您好,我看你给的那片文章,可是我比较纳闷,我里边遵循了模式对话框的规则,我也是后打开的模式对护矿先关闭的,只是我是在切换几次程序之后关闭的,并且只有在debug下才会崩掉,先提示“Uhandled exception in TSTCON32.exe(MFC42D.DLL):0xc0000005:Access Violation”,点击确定就蹦到系统的DWORD COleControlSite::GetDefBtnCode()这个函数里。
    2008年11月29日 1:34
  • 看看this指向哪里
    那篇文章就是说关闭次序不对的话栈会乱掉

    MSMVP VC++
    2009年2月3日 6:01
    版主