Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по выбору группы файлов в CFileDialog. Visual C++ и MFC. 
:(
    Опции темы
AndreySol
Дата 14.7.2004, 05:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 19.6.2004

Репутация: нет
Всего: 1



Вопрос по выбору группы файлов в CFileDialog.
Помогите начинающему в Visual C++ и MFC.
Проблема в следующем: при выборе нескольких файлов в CFileDialog (флаг OFN_ALLOWMULTISELECT установлен) следующим кодом
Код

POSITION ps;
int Result;
CString AddPath = "";
CFileDialog OpenMediaDlg(TRUE, NULL, "*.mp3;*.wav", OFN_HIDEREADONLY | OFN_ALLOWMULTISELECT,  (LPCSTR)"MPEG - аудио(*.mp3)|*.mp3| Файлы звукозаписи(*.wav)|*.wav|");
Result = OpenMediaDlg.DoModal();
if (Result == IDOK)
{
ps = OpenMediaDlg.GetStartPosition();
while (ps)
{
 AddPath = OpenMediaDlg.GetNextPathName(ps);
 // здесь куда-нибудь добавляю полученные пути
}
}

у меня получается такая фигня - если выбираю подряд более 11 файлов или вразброс более 10 то выбора не происходит, функция тупо не выполняется.
Как с этим бороться ?
Заранее Всем спасибо за ответы и подсказки.
PM MAIL   Вверх
AndyY
Дата 14.7.2004, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 8.5.2004
Где: СПб

Репутация: 2
Всего: 4



думаю проблема в размере буфера.
MFC в файловом диалоге использует свой буфер размера _MAX_PATH для выбранных файлов
можно модифицировать код так:

char my_buffer[32000];
OpenMediaDlg.m_ofn.lpstrFile = my_buffer;
OpenMediaDlg.m_ofn.nMaxFile = sizeof( my_buffer );

ну и дальше DoModal



--------------------
PM MAIL WWW   Вверх
AndreySol
Дата 21.7.2004, 05:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 19.6.2004

Репутация: нет
Всего: 1



Я попробовал сделать
Код

char my_buffer[32000];
OpenMediaDlg.m_ofn.lpstrFile = my_buffer;
OpenMediaDlg.m_ofn.nMaxFile = sizeof( my_buffer );

Но получилась такая фигня: если nMaxFile = sizeof( my_buffer ) то при вызове файл-диалога происходит ошибка
Код

// zero out the file buffer for consistent parsing later
ASSERT(AfxIsValidAddress(m_ofn.lpstrFile, m_ofn.nMaxFile));
DWORD nOffset = lstrlen(m_ofn.lpstrFile)+1;
ASSERT(nOffset <= m_ofn.nMaxFile);

ругается на последнюю строку, при этом я вычислил что значение nOffset почемуто равно nMaxFile + 6. Попробовал тупо обойти это модифицировав код:
Код

char my_buffer[32000];
OpenMediaDlg.m_ofn.lpstrFile = my_buffer;
OpenMediaDlg.m_ofn.nMaxFile = sizeof( my_buffer ) + 10;

Все стало работать, но получился другой заскок - после этого в строке файл-диалога "Имя файла" вместо заданного мной фильтра появляется какая-то хренотень, и выбрать файлы можно только предварительно погоняв выбор в "Тип файла".
Так как же всетаки с этим правильно бороться?
PM MAIL   Вверх
Олег М
Дата 21.7.2004, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

Репутация: 7
Всего: 7



Посмотри How To Handle FNERR_BUFFERTOOSMALL in Windows
вроде про это
PM MAIL ICQ   Вверх
AndreySol
Дата 28.7.2004, 05:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 19.6.2004

Репутация: нет
Всего: 1



Посмотрел я эту статью - не то по моему. Может еще какие мысли на эту тему ?
PM MAIL   Вверх
Олег М
Дата 28.7.2004, 05:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

Репутация: 7
Всего: 7



Цитата
Посмотрел я эту статью - не то по моему.

Почему? Слишком сложно?
Это как раз про то как правильно решить проблему с маленьким буфером, что бы всё всегда отрабатывало корректно, а не в только частных случаях
PM MAIL ICQ   Вверх
AndreySol
Дата 30.7.2004, 05:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 19.6.2004

Репутация: нет
Всего: 1



Я не увидел этого решения, а может и не понял. Подскажите если можно на конкретном примере - допустим как надо модифицировать мой исходный код, что бы все заработало.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0459 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.