软件注册站
热情软件屋

 
使用CFileDialog类选择多个文件,发现可选择的个数有限
编号: QA002163    
建立日期: 1999年12月3日 最后修改日期: 2004年2月5日
所属类别: C/C++ - 磁盘、文件和目录
   
    操作系统: Windows95.98
    编程工具: VC
    在使用CFileDialog类选择多个文件,发现可选择的个数有限。据资料说,要将m_ofn.lpstrFile替换成自己的缓冲区指针。(Tony)
   
    选择多个文件,最重要的是加上OFN_ALLOWMULTISELECT标志。当用户选择多个文件,CFileDialog会把选择后的文件名拷贝到一个缓冲区,默认这个缓冲区有200多个字符,这对于很多情况来说太小了。你可以将m_ofn.lpstrFile替换成自己的缓冲区指针:
     char sBuffer[6000];
    
sBuffer[0] = 0;
    
CFileDialog dlg(TRUE, NULL, NULL,
    
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT |
    
OFN_ALLOWMULTISELECT,
    
"C++ source|*.cpp|All files|*.*||");
    
dlg.m_ofn.lpstrFile = sBuffer;
    
dlg.m_ofn.nMaxFile = 6000;
    
    

    如果缓冲区不够大,CommDlgExtendedError()函数的返回值为FNERR_BUFFERTOOSMALL,并且缓冲区的前两个字节包括需要的大小。
    如果使用NT 4.0,必须安装SP2以上版本,否则不管nMaxFile设置成多大,Windows最多返回2562个字符。
    微软的Knowledge Base的文章:“Q131462 HOWTO: Handle FNERR_BUFFERTOOSMALL in Windows 95”提供了另一种方法。
    
    bacchus的意见:
    我用的方法是:GetStartPosition()和GetNextPathName(),代码如下:
    CFileDialog fileDlg(TRUE,_T("*.mif"),_T("*.*"),OFN_ALLOWMULTISELECT,szFilter,NULL);
    
LPOPENFILENAME lpofn ;
    
char szBuffer[6000];
    
    
fileDlg.m_ofn.lpstrFile = szBuffer;
    
fileDlg.m_ofn.nMaxFile = 6000;
    
if(fileDlg.DoModal() == IDCANCEL)
    
return FALSE;
    
pos = fileDlg.GetStartPosition();
    
while((strfilename=fileDlg.GetNextPathName(pos))!= NULL)
    
{
    
........
    
}
    

    

此问题由李海回答。

附加关键字:编程, 源程序, programming, source code, C/C++, MFC, C++ Builder, Borland C++, Turbo C, C, BCB, 磁盘、文件和目录, disk, file, fat, directory, folder

   
 
把这个问题推荐给朋友
   
 
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio