Второе использование CFileDialog в моей программе приводит к ошибке во время выполнения.

Я разработал простую программу с MFC. Он отвечает за чтение и запись файлов geotiff с использованием библиотеки GDAL. Для этой цели я вывел два класса из CFileDialog названный класс ManageOpenGeoTiffFiles а также ManageSaveGeoTiffFiles у каждого есть 3 функции для поддержки чтения и записи геотифов.

это заголовок конструктора и деструктора для одного из них:

ManageOpenGeoTiffFiles::ManageOpenGeoTiffFiles(void):CFileDialog(true,0,0,OFN_ENABLESIZING | OFN_HIDEREADONLY,_T("Tiff Files (*.tif)|*.tif|"),0,0,true)

ManageOpenGeoTiffFiles::~ManageOpenGeoTiffFiles(void)
{
}

и вот как я использую это в моем коде:

void CInitialJobProject2FinalDlg::OnBnClickedBtnopen()
{
// TODO: Add your control notification handler code here
m_oglWindow1.WantToPan = false;
m_oglWindow1.WantToUseZoomTool = false;
CString fullpath;
if ( m_openFiles.DoModal() == IDOK )
{
fullpath = m_openFiles.GetPathName();
try{
m_openFiles.OpenGeoTiffAsReadonly(fullpath);
}
catch(CFileException *e){
MessageBox(_T("the file could not be opened"),_T("error"),MB_OK);
this ->ExitMFCApp();
}
m_openFiles.ReadRasterData();
}
else
MessageBox(_T("you pressed cancel and can not proceed."),_T("error"),MB_ICONERROR);
}

все хорошо, когда я использую Open или же Save кнопку в моей программе впервые, но когда дело доходит до повторного использования, я получаю сообщение об ошибке:

введите описание изображения здесь
и если я нажму игнорировать:
введите описание изображения здесь
эта ошибка возникает в строке:

if ( m_openFiles.DoModal() == IDOK )

каждого диалога и даже если я нажму cancel в первый раз ошибка возникает при повторном использовании диалога.

Строка 398 файла dlgFile.cpp выглядит следующим образом:

hr = (static_cast<IFileDialog*>(m_pIFileDialog))->SetFileTypes(nFilterCount, pFilter);
ENSURE(SUCCEEDED(hr));

Отредактированный раздел:

Отвечая на один из комментариев и предоставляя информацию для других:

Когда я установил точку останова, там увидел эти результаты, когда утверждение не удается:

pFilter 0x00fc3660 {pszName=0x00fc36a8 "Tiff Files (*.tif)" pszSpec=0x00fc3788 "*.tif" }
hr  E_UNEXPECTED

и результаты в первый раз, когда утверждение не ошибается, выглядят следующим образом:

pFilter 0x004cfca0 {pszName=0x004cfce8 "Tiff Files (*.tif)" pszSpec=0x004cfdc8 "*.tif" }
hr  S_OK

0

Решение

Вы передаете искаженную строку фильтра CFileDialog::CFileDialog. В разделе «Замечания» указано следующее условие:

lpszFilter параметр […] заканчивается двумя '|' персонажи.

2

Другие решения

Других решений пока нет …