在Dll中使用连接点技术,DLL所在进程无法退出
类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中,被进程生成释放时,进程不能退出。
问题点数:0、回复次数:8Top
1 楼luohualiushui(落花流水)回复于 2003-12-02 16:43:58 得分 0
当类CFriendSession放在某个Dll中,被进程生成释放时,进程不能退出。
--------------------------------------------------------------------------
这句不明白,进程不能退出?
Top
2 楼wangweixing2000(星(inspiration(灵感)))回复于 2003-12-02 16:58:32 得分 0
GZTop
3 楼bareheadchl2004()回复于 2003-12-03 10:49:46 得分 0
进程不能退出是指当应用程序执行完ExitInstance后,不能转到
释放全局变量,即不是所有的线程退出了。
现在发现
是类CFriendSession的构造器中执行了以下语句导致的:
try
{
HRESULT hr = m_ISession.CreateDispatch(CLSID_JabberSession, e);
ASSERT(SUCCEEDED(hr));
}
catch( COleDispatchException * e )
{
e->Delete();
}
是不是与m_ISession的释放不干净有关?
谢谢先!Top
4 楼luohualiushui(落花流水)回复于 2003-12-03 11:16:32 得分 0
又可能啊
在析构函数中释放m_Isession没有?Top
5 楼xiaohedou(小河豆(充电中.18%.))回复于 2003-12-03 11:18:37 得分 0
当一个DLL退出时会有两个消息发出。DLL_PROCESS_DETCH,或者DLL_THREAD_DETCH,这要看你的程序是如何写的。使用FreeLibraryAndExitThread,这个函数在<核心编程>里有介绍第20章。Top
6 楼bareheadchl2004()回复于 2003-12-03 11:21:37 得分 0
有,在析构器中调用了
m_ISession.ReleaseDispatch();
不知道这个调用能否完全的释放m_ISession?
Top
7 楼bareheadchl2004()回复于 2003-12-03 15:42:27 得分 0
在Dll的DllMain中什么也没做,也就是说对DLL_PROCESS_DETCH,或者DLL_THREAD_DETCH的消息未加处理,请问会有什么影响吗?Top
8 楼bareheadchl2004()回复于 2003-12-03 15:55:45 得分 0
补充一点,在应用程序中有一个窗口使用了位于Dll中的CFriendSession类。Top




