我用MFC做了一个基于对话框的应用程序和一个MFC扩展DLL(也是基于对话框的MFC应用程序)我想在加载DLL的时候弹出一个对话框提示应用程序正在加载DLL,(如:应用程序正在加载,请稍后)然后过几秒这个提示对话框就会自动消失,从而显示出DLL中的对话框我在主应用程序中设置了一个定时器,并在加载显示DLL中对话框的代码前弹出该提示对话框,过一段时间就杀掉这个定时器,并关闭提示对话框,可是提示对话框出来之后一会当杀掉定时器关闭它的时候,那个DLL中的对话框只显示一下就看不见了,我发现虽然看不见,但是程序仍然在运行,不知道为什么DLL中的对话框看不见呢??
void CNewMediaDlg::OnTimer(UINT_PTR nIDEvent) //定时器事件

    if (nIDEvent == 100)
        {
            m_loadTime++;
            if (m_loadTime == 3)
              {
                 m_loadTime = 0;
                 KillTimer(100); //杀掉定时器
                 if (m_pLoadDlg != NULL)
                    { 
                       delete m_pLoadDlg; //关闭提示对话框
                        m_pLoadDlg = NULL;
                     }
                }
          }
    CDialog::OnTimer(nIDEvent);
}void CNewMediaDlg::displayLoadDlg() 
{
    m_loadTime = 0;
    KillTimer(100); //确保没有这个定时器   
    if (m_pLoadDlg != NULL)
        {      
          delete m_pLoadDlg;
          m_pLoadDlg = NULL;
         }
    m_pLoadDlg = new CLoadingDlg;   
    m_pLoadDlg->Create(IDD_LoadingDlg); //弹出提示对画框
    SetTimer(100, 260, NULL); //设置定时器
}void CNewMediaDlg::FlashCallShockwaveflashMain(LPCTSTR request)
{
    CString strInput;
    strInput = request;    int fuc_playTV = -1;
    fuc_playTV = strInput.Find(_T("CallMyTV"), 0);
    if (fuc_playTV > 0)
       {   
          displayLoadDlg(); //展示提示对话框
          CTVDLL dlg;   
          dlg.ShowDlg(); //加载DLL显示DLL中的对话框
      
        }
}//DLL中的代码
void CTVDLL::ShowDlg()
{
     CTvPlayerDlg tvDlg; //主要因为加载构造CTvPlayerDlg类对象时费点时间,考虑到用户体验性所以想在其中加一个提示过渡对话框
      tvDlg.DoModal();
}请大家帮忙看看??

解决方案 »

  1.   

    对话框设置Timer  用GetModuleHandle 判断dll是不是被加载到应用程序的内存空间...  如果返回的HMODULE不为NULL,结束对话框,否则继续提示..
      

  2.   

    弹出一个对话框提示应用程序正在加载DLL
    -------------------------------------------
    DLL 的 WAIMAIN 函数中加几句代码BOOL APIENTRY DllMain( HANDLE hModule, 
      DWORD  ul_reason_for_call, 
      LPVOID lpReserved
      )
    { switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    //提示 应用程序正在加载,请稍后
                       //实现代码
    break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
    break;
    }
    return TRUE;
    }
      

  3.   


    用LoadLibrary显示调用太复杂,我用的隐式调用直接在应用程序中加入.lib文件
      

  4.   

    我制作的DLL是MFC扩展DLL,,再说用你这种方法我什么时候关闭提示对话框啊
      

  5.   

    直接用Loadlibrary不就行了。
    你在定时器中 写了计数三次后就销毁对话框 当然一闪就不见了
      

  6.   

    LoadLibrary 是合适的选择。建议。使用 lib 静态链接的话,问题可以转化为 显示启动画面 CSplashWnd ...
      

  7.   

    我说的一闪不见那个指的是DLL应用程序中的对话框,而不是提示过渡对话框一闪而过,过渡提示对话框并没有一闪而过
      

  8.   

    //DLL中的代码
    void CTVDLL::ShowDlg()
    {
      CTvPlayerDlg tvDlg; //主要因为加载构造CTvPlayerDlg类对象时费点时间,考虑到用户体验性所以想在其中加一个提示过渡对话框
      tvDlg.DoModal();
    }
    ------------------------------------------------------------------------------
    以上各位讨论的重点都是加载DLL的,可是我说了原因是因为DLL中主对话框CTvPlayerDlg类构造对象费时间,因为这个类需要注册一些必要的Filter组件,创建Filter graph Manage,加载flash资源所以用程序来加载这个应用程序DLL看起来就是要等几秒才会显示这个DLL的主对话框