在dll中有一无模式对话框类,由对话框A调用此dll函数来创建并显示它(以下称其为B),B是这样创建的:Create(桌面指针),dll的ExitInstance()中有代码来关闭B。如果窗口A在未销毁(destroywindow)前并且窗口B也未销毁前关闭dll,dll的ExitInstance()中的关闭B的代码可以正常关闭B,dll也顺利被关闭。如果窗口A在OnDestroy中关闭dll,此时窗口B如未销毁则B仍显示在屏幕上,而A已经关闭,程序也被挂起了。为什么会这样呢,如何在A和dll关闭前关闭窗口B?高手帮忙啊。

解决方案 »

  1.   

    你所说的“关闭dll”是如何关闭?B窗口是在DLL的导出函数中创建吗?A与B是同一线程还是不同线程?A窗口关闭后运行什么代码?
      

  2.   


    打开:m_hDll = LoadLibraryW(lpDllName);用FreeLibrary(m_hDll)关闭。
    B窗口是在DLL的导出函数中创建的。A与B是同一线程,B中有运行另一个工作线程,但在B的OnCancel中有用WaitForSingleObject(m_hThread, INFINITE)等待线程结束。
    A窗口关闭后就退出程序,没再运行什么代码,A窗口是程序主窗口。A窗口退出代码:void CTestDlg::OnDestroy()
    {
    if (m_hDll) FreeLibrary(m_hDll);
    if (m_button1)
    {
    if (IsWindow(m_button1->m_hWnd)) m_button1->DestroyWindow();
    delete m_button1;
    }
    if (m_button2)
    {
    if (IsWindow(m_button2->m_hWnd)) m_button2->DestroyWindow();
    delete m_button2;
    }
    CMyDlg::OnDestroy();
    }
      

  3.   

    可能为搞错了,应该是关闭dll前先调用导出函数关闭窗口B没问题,如果在dll的ExitInstance中关闭窗口B则程序被挂起。现在就是想知道能不能通过直接关闭dll来关闭窗口B。
      

  4.   

    这就对了,ExitInstance是FreeLibrary时由DllMain调用的,这个时候程序的优先级较高,不能执行等待函数等待其它线程,否则就会死锁。
      

  5.   

    那么发出FreeLibrary后dll中没有什么事件可阻止关闭的吗?