/******************************************************************************************************/
/*华丽的分割线+提醒线*/
//http://blog.csdn.net/lava555/article/details/7699905
/******************************************************************************************************/
一段打开文档的代码,前一段时间好好地,今天突然出问题了.Access violation 的异常,跟踪发现出在CFileDialog析构的时候.
测试环境:winxp pro + sp2;
编译:vc6.0+sp5;
- void CTestFile::OnOpen()
- {
- char szFilter[256] = {0};
- lstrcpy(szFilter, "WMV File (*.wmv)|*.wmv|");
- lstrcat(szFilter, "媒体文件 (媒体类型)|*.wmv;*.avi;*.mpeg;*.mpg;*.asf||");
-
-
- CFileDialog dlg(TRUE, NULL, NULL, OFN_PATHMUSTEXIST | OFN_HIDEREADONLY, szFilter, this);
- if(dlg.DoModal() == IDOK)
- {
- }
- }
搞了好久,才找到原因,就是因为在stdafx.h中加了下面的两个宏;
- #define WINVER 0x0500
- #define _WIN32_WINNT 0x0500
去掉这两个宏的话,没问题.
如果非要用高版本的platform sdk的话,下面的方法也是一个解决办法.
- void CTestFile::OnOpen()
- {
- char szFilter[256] = {0};
- lstrcpy(szFilter, "WMV File (*.wmv)|*.wmv|");
- lstrcat(szFilter, "媒体文件 (媒体类型)|*.wmv;*.avi;*.mpeg;*.mpg;*.asf||");
-
-
- CFileDialog *pFileDlg = new CFileDialog(TRUE, NULL, NULL, OFN_PATHMUSTEXIST | OFN_HIDEREADONLY, szFilter, this);
- if(pFileDlg)
- {
- pFileDlg->DoModal();
- delete pFileDlg;
- pFileDlg = NULL;
- }
- }
/******************************************************************************************************/
/*华丽的分割线-----------> bug
/******************************************************************************************************/
找到错误如下:
运行时态打开文件夹时程序崩溃。只好用messagebox逐一跟踪。。。
最后找到的solution:
必须先初始化变量CFILEDIALOG定义的变量。debug状态下默认自动初始化,但是release不能。
不过运行release模式也能运行。不解。。。。
- CFileDialog dlg(TRUE,L" ",L"*.*",OFN_HIDEREADONLY| OFN_ALLOWMULTISELECT,L"All Files(*.*)|*.*|Jpeg File|*.jpg||");
而且!!!
如果上一句中末尾部分改成L"All Files(*.*)|*.*||"
也会出错。搞毛。。。
原来的代码巨简单。。。
- 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