使用CFileDialog后相对路径的图片加载失败的问题

来源:互联网 发布:2016年淘宝双11销售额 编辑:程序博客网 时间:2024/05/15 12:56

这几天被一个很困惑的问题给纠结到

是这样的场景:

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