Thanks Giovanni that got me going. I should have RTFM better (or not as the
work, as I found out).
that are handled and Giovanni's code got me going in the right direction.
"Drew" <dam@dam.com> ha scritto nel messaggio
news:u5tE23L0IHA.2084@TK2MSFTNGP06.phx.gbl...
I'm using OFN_ALLOWMULTISELECT as a CFileDialog style and I am having the
problem that when I select above a certain number of files my DoModal()
call returns IDCANCEL.
Hi,
I found an old post I wrote in this newsgroup, with a sample code that may
interest you:
[subject] CFileDialog failure
[date] 2007, October 19th
<code>
//------------------------------------------------------------------
// Given the file list from Open file dialog in multi-select mode,
// parses it and prints its content to the user.
//------------------------------------------------------------------
void CTestDlg::ProcessFileList( LPCTSTR fileList )
{
ASSERT( fileList != NULL );
//
// Parse file list from CFileDialog,
// and build a string list from it
//
LPCTSTR pstr = fileList;
std::vector< CString > strings;
while ( true )
{
if ( *pstr == _T('\0') && *(pstr+1) == _T('\0') )
{
break;
}
// Ciao 0
// 1234 5
// *
// 0123 4
strings.push_back( CString(pstr) );
pstr += (_tcslen(pstr) + 1);
}
//
// Build a message with the file names
//
CString msg;
msg = _T("*** Selected files ***\n\n");
msg += _T("Path : ") + strings.at(0); // First string is path name
msg += _T("\n\n");
for ( size_t i = 1; i < strings.size(); i++ )
{
msg += strings.at(i);
msg += _T("\n");
}
AfxMessageBox( msg );
}
//------------------------------------------------------------------
// Tests Open file dialog in multi-select mode.
//------------------------------------------------------------------
void CTestDlg::OnBnClickedButton1()
{
// Max files in list (including folder path)
const int MaxFileCount = 50;
// Max TCHARs per file
const int MaxFilePath = MAX_PATH;
// Calculate approx size for the given number of max files.
// The "+1" is for the terminating NUL (_T('\0')) character.
const int MaxFileBuffer = MaxFileCount * MaxFilePath + 1;
// const int MaxFileBuffer = 30; // TEST for small buffer
// Buffer for file names
std::vector< TCHAR > fileNamesBuffer(MaxFileBuffer);
// File dialog object, dynamically allocated
// at each loop iteration
CFileDialog * fileDlg = NULL;
while ( true )
{
// Allocate a new file dialog object
ASSERT( fileDlg == NULL );
fileDlg = new CFileDialog(
TRUE, // Open file dialog
NULL, // No default extension
NULL, // Initial file name
OFN_HIDEREADONLY | OFN_ALLOWMULTISELECT,
_T("All files (*.*)|*.*||"), // Filter
this // Parent
);
// Hook our buffer to file dialog structure
fileDlg->GetOFN().lpstrFile = &(fileNamesBuffer[0]);
fileDlg->GetOFN().nMaxFile = (DWORD) fileNamesBuffer.size();
// Clear buffer content, so we don't see garbage
// from the previous iteration
// (if the previous iteration failed).
::ZeroMemory( &(fileNamesBuffer[0]),
fileNamesBuffer.size() * sizeof(TCHAR) );
// Run the dialog-box
INT_PTR result = fileDlg->DoModal();
// Avoid memory leaks
delete fileDlg;
fileDlg = NULL;
// Check result
if ( result == IDCANCEL )
{
// Failure or user pressed Cancel?
DWORD dw = ::CommDlgExtendedError();
if ( dw & FNERR_BUFFERTOOSMALL )
{
// Failure due to few buffer memory;
// tell that to the user
AfxMessageBox( _T("Too many files selected.") );
// Do another iteration
continue;
}
// User pressed cancel, or other error.
// Quit loop.
break;
}
// User pressed OK:
// Show selected files and quit loop.
ProcessFileList( &(fileNamesBuffer[0]) );
break;
}
}
</code>
HTH,
Giovanni