我用CFileDialog类进行打开文件操作,想在打开对话框中选择多个文件,操作如下:
 CFileDialog mFileDlg(TRUE, NULL,NULL, OFN_ALLOWMULTISELECT,_T("Text Files (*.txt|*.txt|
                 All Files (*.*)|*.*||"),  AfxGetMainWnd());
 我从有的网站上看到,要选择足够多的文件时,要对mFileDlg.m_ofn.lpstrFile重新赋值
   mFileDlg.m_ofn.lpstrFile=new TCHAR[2000];   
         memset(mFileDlg.m_ofn.lpstrFile,0,2000);  
 mFileDlg.m_ofn.nMaxFile = 2000;        
...
         delete [] mFileDlg.m_ofn.lpstrFile; 
 而且他说最后的delete [] mFileDlg.m_ofn.lpstrFile是一定要加上的.可是我在做的时候运行出错了,如果我去掉delete [] mFileDlg.m_ofn.lpstrFile就没有问题了.我想问一下有必要delete吗?
为什么会错呢? 请高手指点!!谢谢!!!

解决方案 »

  1.   

    mFileDlg.m_ofn.lpstrFile=new TCHAR[2000];   
       ......
    delete [] mFileDlg.m_ofn.lpstrFile; 是不是应该把delete后边那个[]去掉,这样:delete mFileDlg.m_ofn.lpstrFile; 
      

  2.   

    是不是你执行 delete [] mFileDlg.m_ofn.lpstrFile; 太快了,稍后执行试试
      

  3.   

    去掉delete [] mFileDlg.m_ofn.lpstrFile,会内存泄露。
      

  4.   

    我试过了,delete mFileDlg.m_ofn.lpstrFile 也不对啊.如果内存泄露的话,我怎么能检测到啊??它原来不就有内存空间吗,默认值mFileDlg.m_ofn.nMaxFile = 260,是不是全部释放该内存导致的错误啊??
      

  5.   

    使用CFileDialog类并设置OFN_ALLOWMULTISELECT标志时,OPENFILENAME结构体的lpstrFile成员是一个指向用户申请分配的缓冲区,里面接受所选的路径和文件名列表,这个列表的每一项由一个NULL隔开,最末以两个NULL结束。nMaxFile成员指明了缓冲区的大小,如果所选择的文件名的加起来的总长度超过了此值,则DoModal函数返回IDCANCEL,如果用户试图打开超过缓冲区大小的文件集的话,CommDlgExtendedError()将返回FNERR_BUFFERTOOSMALL,这时候,lpstrFile的前两个byte将会包含实际需要的缓冲区的字节数。如果是在Windows NT 4.0下,能被拷贝到lpstrFile缓冲区的字节数被限制在2562字节以内,如果超过将被截断。以下是一个使用该类进行多文件名选择的例子,希望能对您有所帮助。#include "cderr.h" //for definition of FNERR_BUFFERTOOSMALL      CFileDialog   dlg( TRUE, NULL, NULL, OFN_ALLOWMULTISELECT, NULL, NULL );
          DWORD MAXFILE = 4000
          dlg.m_ofn.nMaxFile = MAXFILE;
          char* pc = new char[MAXFILE];
          dlg.m_ofn.lpstrFile = pc;
          dlg.m_ofn.lpstrFile[0] = NULL;      int iReturn = dlg.DoModal();
          if(iReturn ==  IDOK)
          {
             int nCount = 0;
             POSITION pos = dlg.GetStartPosition();
             while (pos != NULL)
             {
                dlg.GetNextPathName(pos);
                nCount++;
             }
             CString str;
             str.Format("Successfully opened %d files\n", nCount);
             AfxMessageBox(str);
          }
          else if(iReturn == IDCANCEL)
             AfxMessageBox("Cancel");      if(CommDlgExtendedError() == FNERR_BUFFERTOOSMALL)
             AfxMessageBox("BUFFERTOOSMALL");
          delete []pc;
    如果需要进一步的信息,您可以参看:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcmfc98/html/_mfc_cfiledialog.asp以及Q179372等有关信息。
      

  6.   

    哦,是不是不应该delete [] mFileDlg.m_ofn.lpstrFile?