我用MFC做了一个基于对话框的应用程序,主对话框的创建就在应用程序实现文件中:
          CTvPlayerDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();

另外我又在主对话框TvPlayerDlg的实现文件创建另外的对话框:
if (pMsg->wParam == 65)
{
   //EPG对话框
   if (m_pTvEpgDlg != NULL)
   {
       delete m_pTvEpgDlg;
       m_pTvEpgDlg = NULL;
    }
       m_pTvEpgDlg = new CNTvEPGDlg;
       m_pTvEpgDlg->Create(IDD_DIALOG_TVEPG, NULL);
       m_pTvEpgDlg->inputTvDlg(this);
       m_pTvEpgDlg->inputPlayCH(m_CH);
}if (pMsg->wParam == 67)
{    
   //系统设置对话框
   if (m_pSystemSet != NULL)
    {
       delete m_pSystemSet;
       m_pSystemSet = NULL;
     }
       m_pSystemSet = new CNSystemSet;
       m_pSystemSet->Create(IDD_DIALOG_SYSTEMSET, NULL);
       m_pSystemSet->inputTvDlg(this);
}在启动应用程序,出现主对话框窗口时,和创建IDD_DIALOG_TVEPG,IDD_DIALOG_SYSTEMSET出现其窗口是,或退出这些窗口时都会看到一个带标题栏的窗口闪烁一下,我创建的这些对话框都是没有标题栏的,即对话框的Border属性都是None;我搞不清楚闪烁的对话框是什么窗口,为什么会出现这个一个闪烁的窗口呢,怎么解决这个问题,让这个窗口不会出现,请高手帮忙!谢谢!

解决方案 »

  1.   

    看来这个问题没人知道了,可能是描述得不全面吧,下面继续问大家一个问题:我做了一个MFC的应用程序,里面有如下代码取得应用程序的路径:
    CString strAppFullName;
    CString strAppPath;GetModuleFileName(AfxGetApp()->m_hInstance, strAppFullName.GetBuffer(MAX_PATH), MAX_PATH);
    strAppFullName.ReleaseBuffer();
    int nPos = 0;
    nPos = strAppFullName.ReverseFind(_T('\\'));
    strAppPath = strAppFullName.Left(nPos + 1);这个应用程序自己运行没有任何错误。
    可是,现在我把它做成一个MFC扩展DLL
    并再做了一个MFC应用程序来调用这个DLL,在程序调用这个DLL后就会出现访问冲突的错误,调试之后程序停留在
    上面程序的GetModuleFileName(AfxGetApp()->m_hInstance, strAppFullName.GetBuffer(MAX_PATH), MAX_PATH);求高手指点,调用DLL为什么就会出现这个问题呢?
      

  2.   

    GetModuleFileName得到的应该是exe运行的相对路径  
      

  3.   

    GetModuleFileName()得到的是绝对路径,在应用程序中一点错没有,把他放在DLL中就出错了
      

  4.   

        GetModuleFileName这个API在dll中使用的效果是返回宿主exe文件的绝对路径,而不是dll所在的绝对路径,这点需要注意的。
        距离来说,windows下的输入法文件是ime(仅指IME框架下编写的输入法,TSF框架我不太清楚)文件,本质来说就是一个dll文件,不过就是把后缀修改为ime而已。
        在输入法运行的时候,ime文件被加载到宿主进程中,例如Office套间中的word,如果你在ime中使用GetModuleFileName这个API的话,它返回的就是word.exe的位置,而不是ime所在的位置。
      

  5.   

    -------------------------------------------------------------------------------------
    GetModuleFileName这个API在dll中使用的效果是返回宿主exe文件的绝对路径,而不是dll所在的绝对路径
    -------------------------------------------------------------------------------------楼上说的对,那么把它用在API的dll中,要如何才能使它返回DLL所在的绝对路径呢??求楼上在帮帮忙
      

  6.   

    动态获取.dll文件所在目录
    #include < Windows.h>
    添加库文件Kernel32.dll
    CString CLocalization::GetCurrWorkingDir(){       CString strPath;       TCHAR szFull[_MAX_PATH];       TCHAR szDrive[_MAX_DRIVE];       TCHAR szDir[_MAX_DIR];       ::GetModuleFileName(AfxGetApp()->m_hInstance, szFull, sizeof(szFull)/sizeof(TCHAR));       _tsplitpath(szFull, szDrive, szDir, NULL, NULL);    _tcscpy(szFull, szDrive);    _tcscat(szFull, szDir);    strPath = CString(szFull);       return strPath;}
      

  7.   

        楼主自己也找到办法了啊。嘛,我对MFC不是很熟。
         如果是Win32的话,一般的处理方式是在
         dll加载的DLLmain函数入口,将当前dll的HINSTANCE保存到dll的全局变量中
         BOOL WINAPI DllMain(
      [in]                 HINSTANCE hinstDLL, //这个就是moudlehandle
      [in]                 DWORD fdwReason,
      [in]                 LPVOID lpvReserved
    );    然后在调用GetModuleFileName这个API的时候,以保存下来的modulehandle为第一参数,你就可以获得dll所在的绝对路径了。
         [code=C++]
         HINSTANCE g_hInst = NULL;
         BOOL APIENTRY DllMain( HMODULE hModule,
    DWORD  ul_reason_for_call,
    LPVOID lpReserved
    )
    {
    UNREFERENCED_PARAMETER(lpReserved);
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    g_hInst=(HINSTANCE)hModule;
    break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    break;
    case DLL_PROCESS_DETACH:
    ImeClass_Unregister((HINSTANCE)hModule);
    break;
    }
    return TRUE;
    }
         ......
         TCHAR fileRoute[256] = {0};
         GetModuleFileName(g_hInst,fileRoute,256);[/code]