由于对CFileDialog不熟悉,原本想通过CFileDialog的方式得到一个后缀为dat的文件,然后把文件路径写到temp1.file文件中去,最后由foresee这个程序自动读取文件中包含的路径解析执行
结果采用硬编码方式设置path = “...\test.dat”,不采用CFileDialog方式,ForeSee程序就能运行,而用CFileDialog选择路径却执行不了!
所以想请教各位高手,我程序中调用CFileDialog的方法错在哪里?谢谢CString path;
CFileDialog *dlg = new CFileDialog(true, NULL, NULL, OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST, NULL , this);
dlg->m_ofn.lpstrFilter = "DAT File (*.dat) \0*.dat\0\0";
if(dlg->DoModal() == IDOK)
{
   path = dlg->GetPathName();
   if(path.IsEmpty() == 1)
   {
      delete dlg;
      return;
   }
   delete dlg;
          try{
CString pa="C:\\temp1.file";
CFile file(pa,CFile::modeCreate|CFile::modeWrite);
file.Write(path,path.GetLength());
file.Close();
         WinExec("ForeSee.exe",SW_SHOW);

   }
   catch(...)
  {
MessageBox("建立预览文件失败! ");
return;
   }
}

解决方案 »

  1.   

    例子:
    CString path = "c:\test.dat";
       try{
    CString pa="C:\\temp1.file";
    CFile file(pa,CFile::modeCreate|CFile::modeWrite);
    file.Write(path,path.GetLength());
    file.Close();
             WinExec("ForeSee.exe",SW_SHOW);

       }
       catch(...)
      {
    MessageBox("建立预览文件失败! ");
    return;
       }
    程序可以正常执行CString path;
    CFileDialog *dlg = new CFileDialog(true, NULL, NULL, OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST, NULL , this);
    dlg->m_ofn.lpstrFilter = "DAT File (*.dat) \0*.dat\0\0";
    if(dlg->DoModal() == IDOK)
    {
       path = dlg->GetPathName();
       if(path.IsEmpty() == 1)
       {
          delete dlg;
          return;
       }
       delete dlg;
              try{
    CString pa="C:\\temp1.file";
    CFile file(pa,CFile::modeCreate|CFile::modeWrite);
    file.Write(path,path.GetLength());
    file.Close();
             WinExec("ForeSee.exe",SW_SHOW);

       }
       catch(...)
      {
    MessageBox("建立预览文件失败! ");
    return;
       }
    }
    选择c盘下的test.dat,程序ForeSee.exe就不能正常解析执行test.dat文件,temp1.file下的文件路径是对的
      

  2.   

    因为使用了 CFileDialog后 程序目录会改变 ...
    WinExec("ForeSee.exe",SW_SHOW);
    就会找不到ForeSee.exe文件出错...
      

  3.   

    你的问题是:当CFileDialog选中文件后,改变了windows当前路径,ForeSee.exe不再在当前路径下,执行失败。
    CFileDialog *dlg = new CFileDialog(true, NULL, NULL, OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_NOCHANGEDIR  , NULL , this); //加上OFN_NOCHANGEDIR 标志,CFileDialog在选中文件后不会改变当前路径
      

  4.   

    产生对话框之前设置m_ofn的flag 加上  OFN_NOCHANGEDIR  就可以不改变了..
      

  5.   

    呵呵,多谢多谢,放心,两位都给分,嘿嘿
    我觉得奇怪的是foresee.exe是会被执行的哦,因为foresee执行以后会把temp1.file给删除,只是不知道为啥不能正常解析dat文件
      

  6.   

    foresee内部是读取temp1.file包含的内容,比如是一个视频文件路径,然后foresee来解析播放这个视频文件现在的问题是foresee是可以执行的,但是视频文件没播放
      

  7.   

    哦? 
     那这个temp1.file的路径是不是也被影响到了呢?
    改动CFiledialog之后 还出现这现象么??
      

  8.   

    问题:那这个temp1.file的路径是不是也被影响到了呢?
    答:没有,非常奇怪的是temp1.file的路径是对的问题:改动CFiledialog之后 还出现这现象么??
    答:程序可以正常运行呢,但是还是不明白为啥加了这个会正确,嘿嘿,所以还得麻烦高手们给我解释下,多谢我的程序分成两部分:
    主程序:它的主要功能是获取要浏览的dat文件路径,并把文件路径存储在temp1.file中,最后调用WinExec("ForeSee.exe",SW_SHOW)去启动ForeSee.exe;ForeSee.exe:启动以后自动读取temp1.file,获得要播放的dat文件路径,解析执行现在的问题在于:
    采用硬编码方式即直接写temp1.file文件,比如:c:\test.dat,ForeSee.exe是能正常执行,并播放test.dat内包含的视频文件
    但采用了CFileDialog以后,选择c盘下的test.dat,temp1.file文件内容是正确的:c:\test.dat,而且ForeSee.exe也能启动,只是启动以后它不会播放test.dat内包含的视频文件        
    我曾经试过把这部分代码分成两部分,一个CFileDialog来选择路径,再有另外一个按钮来执行WinExec("ForeSee.exe",SW_SHOW),惊讶的发现:如果先选择路径后直接点按钮,ForeSee.exe能启动但不会播放test.dat内包含的视频文件,如果先选择路径,关闭主程序,再打开主程序,点击按钮,程序执行正常所以我想是不是使用CFileDialog不对会导致它占用甚么资源?请高手再帮忙解释下,多谢多谢
      

  9.   

    不知道代码..解释不了...
    猜测吧..呵呵foresee.exe 是不是也需要知道路径(因为它的代码里直接找的就是当前路径)...那这个temp1.file的路径是不是也被影响到了呢?
    答:没有,非常奇怪的是temp1.file的路径是对的能说下你怎么测试出来这个结果的,
    测试出foresee.exe确实找对了temp1.file的路径,但就是不播放(因为一个奇怪的原因) ?
    foresee.exe是你代码程序吗? hehe.如果你觉得真的是有问题,那我也不知道了..使用Cfiledialog好像除了影响程序目录 外 没什么值得关注的 呵呵~~
      

  10.   

    CFileDialog 改变工作目录,要setworkdic 设回来
      

  11.   

    能说下你怎么测试出来这个结果的,
    测试出foresee.exe确实找对了temp1.file的路径,但就是不播放(因为一个奇怪的原因) ?
    foresee.exe是你代码程序吗? hehe.我把程序分成两段了,一段是cfiledialog,一段是winexec,然后执行完cfiledialog后我去c盘下打开temp1.file,里面的路径确实就是我需要的,而且当我把关闭一次主程序,再打开主程序,在点执行winexec的按钮,程序是能正常运行的,但前提是,必须先关闭一次主程序,郁闷,呵呵多谢,结帖,嘿嘿