在MSDN对于文件对话框有这么一段话:
“When the user allocates their own buffer to accommodate OFN_ALLOWMULTISELECT, the buffer can't be larger than 2048 or else everything gets corrupted (2048 is the maximum size).”我的问题是,为什么不能大于2048字节,是因为缓冲区是在栈里面吗,new一个不行吗?

解决方案 »

  1.   

    好像是这个类中默认了OFN_ALLOWMULTISELECT属性时多选的文件名最大长度是2048,可以修改这个最大值。
    使用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等有关信息。
      

  2.   

    我看了你的代码,但问题是MSDN上不是说了自己分配空间时不能大于2048吗,而你那个代码直接就是4000