2013-09-01 2 views
0

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

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

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); 
} 

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

enter image description here и если я нажимаю игнорировать:
enter image description here
эта ошибка возникает в строке:

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

Покажите нам, на что указывает pFilter. Какова ценность hr, как только ASSERT? –

+0

@Michael Walz Я ответил на ваш комментарий, пожалуйста, просмотрите раздел **, отредактированный ** – sepideh

ответ

2

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

The lpszFilter parameter [...] ends with two '|' characters.