类CFriendSession从CCmdTarget继承,
CFriendSession的构造器中调用:
BOOL bRet = AfxConnectionAdvise(m_ISession, IID_ISessionEvents, m_session_sink, FALSE,&m_session_cookie); 在CFriendSession的析构器中调用:
BOOL bRet = AfxConnectionUnadvise(m_ISession, IID_ISessionEvents, m_session_sink, FALSE,m_session_cookie);
断开连接。当类CFriendSession直接被进程生成释放时,进程可正常退出。当类CFriendSession放在某个Dll中,被进程生成释放时,进程不能退出。

解决方案 »

  1.   


    当类CFriendSession放在某个Dll中,被进程生成释放时,进程不能退出。
    --------------------------------------------------------------------------
    这句不明白,进程不能退出?
      

  2.   

    进程不能退出是指当应用程序执行完ExitInstance后,不能转到
    释放全局变量,即不是所有的线程退出了。
    现在发现
    是类CFriendSession的构造器中执行了以下语句导致的:
    try
    {
    HRESULT hr = m_ISession.CreateDispatch(CLSID_JabberSession, e);
    ASSERT(SUCCEEDED(hr));
    }
    catch( COleDispatchException * e )
    {
    e->Delete();
    }是不是与m_ISession的释放不干净有关?
    谢谢先!
      

  3.   

    又可能啊
    在析构函数中释放m_Isession没有?
      

  4.   

    当一个DLL退出时会有两个消息发出。DLL_PROCESS_DETCH,或者DLL_THREAD_DETCH,这要看你的程序是如何写的。使用FreeLibraryAndExitThread,这个函数在<核心编程>里有介绍第20章。
      

  5.   

    有,在析构器中调用了
    m_ISession.ReleaseDispatch();
    不知道这个调用能否完全的释放m_ISession?
      

  6.   

    在Dll的DllMain中什么也没做,也就是说对DLL_PROCESS_DETCH,或者DLL_THREAD_DETCH的消息未加处理,请问会有什么影响吗?
      

  7.   

    补充一点,在应用程序中有一个窗口使用了位于Dll中的CFriendSession类。