创建一个主程序,在该主程序的某个函数中,做如下事情:1  hDll = LoadLibrary(_T("test.dll"));
2  TestFunProc proc = GetProcAddress(hDll, "TestFun");
3  proc();test.dll直接由向导生成,MFC DLL。然后添加并导出一个函数TestFun。void TestFun()
{
    CFileDialog dlg(TRUE);
    dlg.DoModal();
}
运行主程序,能够弹出对话框,但是主程序在退出的时候,会发生异常,这是很奇怪的一个事情。大家有谁碰到过这个问题吗?

解决方案 »

  1.   

    TestFun里面第一行用AFX_MANAGE_STATE(AfxGetAppModuleState());切换资源
      

  2.   

    TestFunProc 的定义要为_stdcall 检查下.......
      

  3.   


    这个不一定,只要TestFunProc定义和TestFun一致就行了。
      

  4.   

    没用的,我都试过了。主程序退出会异常。我用vs2005和2008都试过了。void OpenFileDlg()
    {
    //AFX_MANAGE_STATE(AfxGetAppModuleState());
    //AFX_MANAGE_STATE(AfxGetStaticModuleState()); CFileDialog dlg(TRUE);
    dlg.DoModal();
    }
      

  5.   

    你先注释掉TestFun里面的代码试试看是否是这个地方出了问题如果是,那说明应该是跨模块分配内存创建窗口造成的
    在DestroyWindow处会出错跨模块内存分配解决方法很多,google一下即可
      

  6.   

    断点到你程序析构的地方,如果跳出异常,查看Call Stack可以查找原因
      

  7.   

    楼上几位,主程序也是向导生成的Demo,啥都没干,就加了我说的调用Dll的那几行代码。不信的话,大家自己写个Demo测试一下不就知道了。向导生成代码不到1分钟。
      

  8.   

    _crtExitProcess里面,没法跟踪。我做c/c++,vc/mfc 都快十年了。应该不是我的的代码错误。
      

  9.   

    记得好像遇到过CFileDialog在DLL中一闪就过去,停不下的情况。记得好像是资源方面的问题。
      

  10.   


    把CFileDialog构造的参数都填上,特别是pParentWnd
      

  11.   

    这些简单问题,我考虑过了。同志,你按我说的,写个测试Demo吧,很快的,1分钟就好。测试函数定义为:
    typedef void (*OpenFileDlgProc)(CWnd* parent);
      

  12.   

    我测试了,我这里没有报任何错。DLL就是MFC shared DLL
    TestFun输出写在def文件里面。
    主程序是新建的单文档工程。
    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
    return -1;

    if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
    | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
    !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
    {
    TRACE0("Failed to create toolbar\n");
    return -1;      // fail to create
    } if (!m_wndStatusBar.Create(this) ||
    !m_wndStatusBar.SetIndicators(indicators,
      sizeof(indicators)/sizeof(UINT)))
    {
    TRACE0("Failed to create status bar\n");
    return -1;      // fail to create
    } // TODO: Delete these three lines if you don't want the toolbar to be dockable
    m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
    EnableDocking(CBRS_ALIGN_ANY);
    DockControlBar(&m_wndToolBar);        //就这么写的退出没什么异常
    typedef void (*TestFunProc)();
    HINSTANCE h = LoadLibrary(_T("test.dll"));
    TestFunProc proc = (TestFunProc)GetProcAddress(h, "TestFun");
    proc(); return 0;
    }
      

  13.   

    建议:
    1、void OpenFileDlg(); 函数建议修改成 BOOL OpenFileDlg();2、最好申明是 __cdecl 或者 WINAPI;我使用 BOOL ... __cdecl 测试了,没有问题。
      

  14.   

    CFileDialog会改变当前目录,使用完毕回复当前目录。
      

  15.   

    一句话  静态中使用mfc