我用MFC开发了一个简单的程序。它负责使用GDAL库读取和编写geotiff文件。为此,我从CFileDialog
类派生了两个类ManageOpenGeoTiffFiles
和ManageSaveGeoTiffFiles
,每个类都有3个函数来支持读写geotiff。
这是其中一个的构造函数和析构函数的标题:
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
,第二次使用对话框时也会出现错误。
dlgFile.cpp第398行如下:
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 :(得分:2)
您正在将格式错误的过滤字符串传递给CFileDialog::CFileDialog
。备注部分说明了以下条件:
lpszFilter
参数 [...] 以两个'|'
字符结尾。