CFileDialog 在使用sdk 后出现异常 Access violation

/******************************************************************************************************/

/*华丽的分割线+提醒线*/

//http://blog.csdn.net/lava555/article/details/7699905

/******************************************************************************************************/
一段打开文档的代码,前一段时间好好地,今天突然出问题了.Access violation 的异常,跟踪发现出在CFileDialog析构的时候.
测试环境:winxp pro + sp2; 

编译:vc6.0+sp5;

[cpp] view plain copy
  1. void CTestFile::OnOpen()   
  2. {  
  3.   char szFilter[256] = {0};  
  4.   lstrcpy(szFilter, "WMV File (*.wmv)|*.wmv|");  
  5.   lstrcat(szFilter, "媒体文件 (媒体类型)|*.wmv;*.avi;*.mpeg;*.mpg;*.asf||");  
  6.   
  7.   
  8.    CFileDialog dlg(TRUE, NULL, NULL, OFN_PATHMUSTEXIST | OFN_HIDEREADONLY, szFilter, this);  
  9.    if(dlg.DoModal() == IDOK)  
  10.   {  
  11.    }  
  12.  }  


搞了好久,才找到原因,就是因为在stdafx.h中加了下面的两个宏;
[cpp] view plain copy
  1. #define WINVER 0x0500  
  2. #define _WIN32_WINNT 0x0500  

去掉这两个宏的话,没问题.
如果非要用高版本的platform sdk的话,下面的方法也是一个解决办法.

[cpp] view plain copy
  1. void CTestFile::OnOpen()   
  2. {  
  3.  char szFilter[256] = {0};  
  4.  lstrcpy(szFilter, "WMV File (*.wmv)|*.wmv|");  
  5.  lstrcat(szFilter, "媒体文件 (媒体类型)|*.wmv;*.avi;*.mpeg;*.mpg;*.asf||");  
  6.   
  7.   
  8.  CFileDialog *pFileDlg = new CFileDialog(TRUE, NULL, NULL, OFN_PATHMUSTEXIST | OFN_HIDEREADONLY, szFilter, this);  
  9.  if(pFileDlg)  
  10.  {  
  11.      pFileDlg->DoModal();  
  12.      delete pFileDlg;  
  13.      pFileDlg = NULL;  
  14.    }  
  15. }  


/******************************************************************************************************/
/*华丽的分割线-----------> bug
/******************************************************************************************************/
找到错误如下:
运行时态打开文件夹时程序崩溃。只好用messagebox逐一跟踪。。。
最后找到的solution:


必须先初始化变量CFILEDIALOG定义的变量。debug状态下默认自动初始化,但是release不能。
不过运行release模式也能运行。不解。。。。
[cpp] view plain copy
  1. CFileDialog dlg(TRUE,L" ",L"*.*",OFN_HIDEREADONLY| OFN_ALLOWMULTISELECT,L"All Files(*.*)|*.*|Jpeg File|*.jpg||");  


而且!!!
如果上一句中末尾部分改成L"All Files(*.*)|*.*||" 也会出错。搞毛。。。
原来的代码巨简单。。。


[cpp] view plain copy
  1. CFileDialog dlg(TRUE); 


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

另一篇文件的解释是:

问题的产生原因在

http://codeguru.earthweb.net/forum/printthread.php?t=320297&pp=50

有所解释,我认为大体可以理解为:

VC6 自带的SDK和 MFC42中的定义,再后来的SDK中更新了,从而导致在析构的时候多卸载了内容


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


此外还有一个冲突:

(1)CoInitializeEx(0, COINIT_MULTITHREADED); 会与CFileDialog冲突
会导致CFileDialog打开的对话框中“我的电脑”空白,无内容显示。

解决:最后是两者不要放在同一个线程中。也可以将CoInitialize(NULL)替换CoInitializeEx(0, COINIT_MULTITHREADED);

http://blog.csdn.net/harbinzju/article/details/6106597

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

再补上一个问题:

一次工作中,调用CFileDialog保存为一个Word文件,然后程序中套接字竟然不能连接了,查来查去,还以为是存Word格式自动化部分的问题,百思不得其解,最后终于定位到CFileDialog调用后,改变了工作目录,导致套接字初始化通用ini配置文件路径改变——传递进去默认ip地址!


最好使用GetCurrentDirectory和SetCurrentDirectory对当前工作目录做一个保存与恢复!

http://blog.csdn.net/dijkstar/article/details/7199912


你可能感兴趣的:(CFileDialog 在使用sdk 后出现异常 Access violation)