Почему CFileDialog:: GetNextPathName не работает, когда путь к файлу длинный?

С помощью CFileDialog класс, Я выбираю несколько файлов, помещенных в каталог с длинным путь. Это нормально, когда я выбираю только один или два файла; но когда я выбираю три файла одновременно, он возвращает только часть третьего пути к файлу. (Похоже, что он ограничен 512 символами) как я могу это решить?

2 ответов


MFC использует буфер по умолчанию размере _MAX_PATH и именно поэтому вы видите такое поведение. Посмотреть dlgfile.cpp для реализации CFileDialog::CFileDialog и вы увидите m_ofn.lpstrFile и m_ofn.nMaxFile установить.

вы можете указать больший буфер, если вы хотите. Перед вызовом DoModal вы можете получить доступ к CFileDialog::m_pOFN член, чтобы получить указатель на OPENFILENAME что CFileDialog будет использовать и обновлять его прямо или вызов CFileDialog::GetOFN чтобы получить ссылку на структуру и обновление что.

в любом случае вы найдете это полезным:http://msdn.microsoft.com/en-US/library/ms646839 (v=против 80).aspx


предполагая, что ваш код выглядит примерно так:

CFileDialog dialog(...);
dialog.DoModal();

определить максимальное количество файлов, которые вы хотите поддержать, например:

#define MAX_FILE_NAMES 256

добавить перед вызовом DoModal:

CString data;
dialog.m_pOFN->nMaxFile = (MAX_FILE_NAMES*(MAX_PATH+1))+1;
dialog.m_pOFN->lpstrFile = data.GetBuffer((MAX_FILE_NAMES*(MAX_PATH+1))+1);

добавьте это после вызова DoModal:

data.ReleaseBuffer();