这几天被一个很困惑的问题给纠结到
是这样的场景:
XP系统启动CFileDialog用来选择一张图片。返回后页面整个程序资源重新加载一次。
问题出现了。关闭这个后所有相对路径的图片都加载失败了!!
放到WIN7系统上竟然正常!!
一开始以为是SP1补丁没有打,试了不管用。由英文版vs2008改成中文版vs2008也不管用。
经过两天分析,发现问题出在我加载图片是相对路径,而绝对路径没问题,试着把路径改了可以了。但是为了弄清楚为什么,又经过一番分析,发现问题出在当前路径上,也就是函数GetCurrentDirectory返回的路径上。在没进入选择dialog前这个路径是我执行文件的路径。进入选择dialog后路径变成了选择的那个路径。导致所有相对路径图片都加载失败了。
终极改法:
const TCHAR szFilters[]= _T("Icon files (*.png)|*.ico|All Files (*.*)|*.*||");
CFileDialog dlg(TRUE, _T("png"), _T("*.png"), OFN_FILEMUSTEXIST| OFN_READONLY, szFilters);
WCHAR azOldPath[MAX_PATH];
GetCurrentDirectory(MAX_PATH,azOldPath);
if (dlg.DoModal() == IDOK)
{
WCHAR azRealPath[MAX_PATH];
GetCurrentDirectory(MAX_PATH,azRealPath); //这个作用和
dlg.GetPathName 是同一个值
SetCurrentDirectory(azOldPath);//这里把路径还原
}
应该是在win7上微软把这个问题修复了。理论上从CFileDialog回来后路径应该还回还原,但是xp上就没有。应该是微软的一个bug吧。
可以随便写个简单程序实验一下
const TCHAR szFilters[]= _T("Icon files (*.png)|*.ico|All Files (*.*)|*.*||");
CFileDialog dlg(TRUE, _T("png"), _T("*.png"), OFN_FILEMUSTEXIST| OFN_READONLY, szFilters);
WCHAR azOldPath[MAX_PATH];
GetCurrentDirectory(MAX_PATH,azOldPath);
CImage img;
img.Load(_T("res/test.png"));//在启动dialog之前加载这张图是可以的
if (dlg.DoModal() == IDOK)
{
CImage img2;
//SetCurrentDirectory(azOldPath);//这里把路径还原,加了这句就不会失败
img2.Load(_T("res/test.png"));//在启动dialog后这个就会加载失败
if(img2.IsNull())
{
ASSERT(0);
}
}