我现在编写一个程序,其中在一个mfc的扩展dll中使用到了CFiledailog,但一旦DoModal的时候,就会引起整个程序闪退。
诡异的是,这种情况不是每次都会出现,过段时间重新编译一下,它就正常了,或者更改一些其他的代码后再编译,它也正常了。也就是说,好些每次编译是随机会出现这个问题,但只要编译好后,如果它会闪退,就一直会闪退。
我不知道是哪出了问题,是主程序?是dll?
我尝试的一些方法,包括创建对象的时候填写完整参数,将DoModal放在try模块中,等等,都无法解决问题。
我使用的环境是xpsp3,vc2008+sp1,release版本。我必须在扩展dll中使用它。
请教啊请教!
CFiledailog,闪退

解决方案 »

  1.   

    我还尝试了在堆上创建CFiledailog*,#ifdef _WIN32_WINNT
    #undef _WIN32_WINNT
    #endif以及使用GetOpenFileName的方法,都一样的。
      

  2.   

    用openfilename看看,如果这个也出错的话,检查你的计算机上的shell扩展
      

  3.   

    能具体点么?应该像你说的一样,因为我用openfilename也是一样的
    能看到文件选择对话框创建出来,但马上闪退,程序也闪退。
    由于我用到了其他的dll,只有release版的,所以我也是直接release编译,木有debug
    我找了所有网上的方法,都无效
    现在我感兴趣的是,为什么同样的环境,有时候能编译正常,有时候闪退
      

  4.   

    装一个ShellExView之后把第三方的扩展禁用掉看看
      

  5.   

    印象中好像遇到过这问题,是UNICODE还是什么引起的来的,忘了。
      

  6.   

    找到了,这是4年前一个从CFileDialog类派生类前面的注释,改造CFileDialog类用于预览图像的。
    //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    //
    //        这个 DLL 应用时一定在主程序资源里面增加一个 FILEOPEN_TEMPLATE  对话框模板
    //        否则 DoModal 不出现停留的对话框
    //        2009 03 26
    //
    //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      

  7.   

    楼上能详细点么?是在主程序中?还是在dll中?添加一个对话框资源?
      

  8.   

    在主程序的资源中声明 "FILEOPEN_TEMPLATE"
    /////////////////////////////////////////////////////////////////////////////
    //
    // Dialog
    //FILEOPEN_TEMPLATE DIALOGEX 0, 0, 95, 15
    STYLE DS_SETFONT | DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_CLIPSIBLINGS
    FONT 8, "MS Sans Serif", 0, 0, 0x0
    BEGIN
        LTEXT           "",stc32,0,2,8,8,NOT WS_VISIBLE | NOT WS_GROUP
        GROUPBOX        "",6000,10,2,81,9,NOT WS_VISIBLE
    END
    /////////////////////////////////////////////////////////////////////////////
    //
    // DESIGNINFO
    //#ifdef APSTUDIO_INVOKED
    GUIDELINES DESIGNINFO 
    BEGIN
        "FILEOPEN_TEMPLATE", DIALOG
        BEGIN
            LEFTMARGIN, 7
            RIGHTMARGIN, 88
            TOPMARGIN, 7
            BOTTOMMARGIN, 8
        END
    END
    #endif    // APSTUDIO_INVOKED#endif    // 英语(美国) resources
    /////////////////////////////////////////////////////////////////////////////
      

  9.   

    在DLL中从CFileDialog派生一个新类。
    class AFX_EXT_CLASS CPreviewFileDialog : public CFileDialog
    设置
    m_ofn.lpTemplateName = "FILEOPEN_TEMPLATE";
      

  10.   

    目前测试了一下,好像问题得到了解决。再换几次环境看看。
    十分感谢gordon3000!!!!!
      

  11.   

    再继续问个问题,我使用的是sqlite3数据库,在主程序m.exe中生产数据,通过WinExec调用另一个v.exe查看数据,使用了虚表。查看的时候一切都没问题。但v.exe退出后,再关闭m,会出现内存问题。
    我的尝试:
    1、在v中只定义一个sqlite db对象,不打开,不关闭。
    2、打开数据库,不关闭。
    3、关闭数据库。
    4、在v中打开与m中不同的数据库。
    都是一样的情况。