我创建了一个基于MFC的dll文件,该dll提供了显示对话框功能,我在对话框中加入了一个关闭对话框的按钮,但是当我把该dll加入到一个基于MFC的exe中(基于单文档)的工程中后,运行工程,点击菜单调用dll,成果显示后,当关闭该dll后,整个工程也会随之关闭。不知道问题出在什么地方?请大侠相救。会有高分答谢!本人MSN:[email protected]

解决方案 »

  1.   

    估计dll推出导致exe出错了,也跟着退出了,检查一下dll的释放部分代码
      

  2.   

    //数据库恢复备份
    HINSTANCE hDll;
    hDll=LoadLibrary("BackupDLL.dll");
    if (NULL==hDll)
    {
    MessageBox("load dll failed!");
    return;
    }
    typedef void(*pFunShowDlg)(CString);
    pFunShowDlg pShowDlg;
    pShowDlg=(pFunShowDlg)GetProcAddress(hDll,"ShowDlg");
    if (NULL==pShowDlg)
    {
    MessageBox("Function load failed!");
    }
    CString strSQL;
    strSQL.Format("driver={SQL Server};Server=127.0.0.1;DATABASE=cljkdb;uid=sa;pwd="); 
    pShowDlg(strSQL);
    FreeLibrary(hDll);以上是我的dll调用和释放代码。
      

  3.   

    DLL导出MFC资源记得加上
    AFX_MANAGE_STATE(AfxGetStaticModuleState())
      

  4.   

    ShowDlg函数怎么写的?EXE与DLL是用相同版本的VC生成的吗?
      

  5.   

    对话框是模式还是非模式的,如果是非模式的,把FreeLibrary去掉试试看
      

  6.   

    楼主用的是MFC的DLL吧?首先用MFC的DLL,如果需要弹出对话框messagebox的话,AFX_MANAGE_STATE(AfxGetStaticModuleState())是一定要加上的,另外就是,在MFC中,messagebox是封装过的,不能指定父窗体的hwnd,在对话框弹出后,是不会中断当前进程和线程的,所以,在你点确定后,如果进程或者线程已经执行完成,对话框找不到返回的窗体或者调用者,就会出错了。建议你可以试试用::MessageBox,然后把线程所在的主窗体的hnwd当参数传入,让对话框弹出时,能正常的停止线程,等用户点击确定后,退出线程,应该就不会出这样的问题了。
      

  7.   

    我同样遇到过,那时做一个外挂,只要卸载DLL,游戏程序就挂掉了,至今不知怎知回事,后来换了种方法。
      

  8.   


    #include "StdAfx.h"
    #include "Dllexport.h"
    #include "DBBackRestore.h"extern "C" __declspec(dllexport) void ShowDlg(const char* strDBCon,const char* strUserName = "who")
    {
    CDBBackRestore BRDlg;
    BRDlg.m_strDBCon = strDBCon;
    BRDlg.m_strCurUseName = strUserName;
    BRDlg.DoModal();
    }
    //
    以上是我的showdlg函数,exe和dll是相同的版本
      

  9.   

    当我按照上面两位大侠的建议,将FreeLibrary(hDll); 注释掉后,当我关闭dll模块,过将近20秒,会弹出这样的错误。
    Debug Assertion Failed!
    program:
    File:afxcmn.inl
    Line:272For information on how your program can causean assertion failure, see the Visual C++ on asserts.
      

  10.   

    函数类型定义错了:
    typedef void (*pFunShowDlg)(const char*, const char*);
      

  11.   

    调用时也要改一下:
    pShowDlg(strSQL, "who");
      

  12.   

    修改BOOL CDBBackRestore::OnInitDialog() 函数,逐个屏蔽代码,定位测试点,找个出错语句
      

  13.   

    这里是肯定要改的,如果还出现问题,说明还有其它错误的地方。
    你先把DLL这个函数中的代码都注释掉试试,如果这样没有问题,再改成只注释掉BRDlg.DoModal()这行看看。
      

  14.   

    问题暂时解决。稍后我会总结一下。然后揭帖。感谢各位。特别是ilovedrv帮忙分析调试。
      

  15.   


    //数据库恢复备份 
    HINSTANCE hDll; 
    hDll=LoadLibrary("BackupDLL.dll"); 
    if (NULL==hDll) 

    MessageBox("load dll failed!"); 
    return; 

    typedef void(*pFunShowDlg)(CString); 
    pFunShowDlg pShowDlg; 
    pShowDlg=(pFunShowDlg)GetProcAddress(hDll,"ShowDlg"); 
    if (NULL==pShowDlg) 

    MessageBox("Function load failed!"); 
    //如果pShowDlg为NULL,程序还会继续往下走

    CString strSQL; 
    strSQL.Format("driver={SQL Server};Server=127.0.0.1;DATABASE=cljkdb;uid=sa;pwd="); 
    pShowDlg(strSQL); //如果pShowDlg为NULL,还会执行这一行
    FreeLibrary(hDll); 
      

  16.   

    经过调试修改,我将CDirTreeCtrl类中的InsertDriveItem(CString i_strDriveString)函数中调用的LookForChanges(strTemp)给注释掉了,就不会出现我原来所出现的问题。但具体是因为什么我没有搞明白。我看到LookForChanges(strTemp)加载了CloseHandle(hThread)函数,按理说应该没有问题。
    所有,有用过找个类的朋友,可以看一下这部分,然后给说说其中的原因。