MFC程序打开文件对话框出错的问题解决
前几天从网上下了个图像分析的mfc小程序,是VC6的
用VC6在本地编译生成都没问题。执行起来弹出一个未处理的错误,程序崩溃退出。
想起来原来遇到过打开文件对话框方面的问题,当时项目时间紧张未能深究。
这次要好好看下这个问题。
详细做法就是深入仔细的跟踪、跟踪、跟踪。
。。
应用代码,跟进
MFC的代码,跟进
Alt+8调出反汇编,跟进。
。
。
重复多次重复追踪、缩小目标。确定问题是:在CFileDialog 的析构函数中,调用了CString 的析构函数,
恰恰是析构CSring 出错了。
CFileDialog 的定义例如以下,就是析构这个 m_strFilter 出错的。
class CFileDialog : public CCommonDialog
{
DECLARE_DYNAMIC(CFileDialog)
public:
// Attributes
OPENFILENAME m_ofn; // open file parameter block
// Constructors
CFileDialog(BOOL bOpenFileDialog, // TRUE for FileOpen, FALSE for FileSaveAs
LPCTSTR lpszDefExt = NULL,
LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
LPCTSTR lpszFilter = NULL,
CWnd* pParentWnd = NULL);
......省略n 多行
protected:
BOOL m_bOpenFileDialog; // TRUE for file open, FALSE for file save
CString m_strFilter; // filter string
// separate fields with '|', terminate with '||\0'
TCHAR m_szFileTitle[64]; // contains file title after return
TCHAR m_szFileName[_MAX_PATH]; // contains full path name after return
OPENFILENAME* m_pofnTemp;
virtual BOOL OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult);
};
发现这里面找的m_strFilter 的地址就不正确
0012F7EC 是 CFileDialog 实例的地址
析构m_strFilter 找的是0012F8A8,再运行就会出错。去这个地址瞄一眼。感觉就不正确啊
于是在构造函数跟踪时。发现m_strFilter 的地址是0012F89C
比較两次合成ecx 中m_strFilter的this指针时。非常明显不同
add ecx 0b0h ;构造时
add ecx 0bch ;析构时
喔喔,算偏移嘛。怎么会不一样呢,这个,再花时间研究下吧。
嗐呀,说不定有人研究过啦。灵机一动,bing 下"add ecx 0b0h",果然。第一条就命中
http://blog.titilima.com/show-590-1.html。这里已有答案。
感谢作者李马先生 :-)
原因讲的非常清楚了。
但是怎么改呢,难道去动vs 的源代码。
当然VS的源代码也是能够改的。只是呢,通过定义追溯文件发现到了
C:\Program Files\Microsoft SDKs\Windows\v7.1\Include 以下
当初MFC4.2 的年代应该还没有v7.1 的版本号呀,去看下文件夹设定吧
v7.1 的include 在最上面。
果断移到最下。所有又一次生成,没问题啦,奥也。
自已是否动过这个设定记不清了。亦或是后来装VS2010或DDK的时候影响了??
总之呢,我们能够觉得。就VC6本身来说还是没问题的,因为安装多个开发环境造成的冲突是本问题出现的原因。
转载于:https://www.cnblogs.com/liguangsunls/p/6839582.html
MFC程序打开文件对话框出错的问题解决相关推荐
- MFC中打开文件对话框:CFileDlg
MFC中打开文件对话框:CFileDlg CFileDialog 文件选择对话框的使用:首先构造一个对象并提供相应的参数,构造函数原型如下: CFileDialog::CFileDialog( BOO ...
- MFC中的文件对话框类CFileDialog详解
目录 文件对话框的分类 文件对话框类CFileDialog 对话框选项常用属性(实例:dialog) 对话框常用方法 文件对话框实例 文件对话框的分类 文件对话框分为打开文件对话框和保存文 ...
- windows api打开文件对话框
用windows api 写打开文件对话框主要使用OPENFILENAME ,GetOpenFileName, GetSaveFileName; 1.OPENFILENAME 结构体介绍:要使用Get ...
- python打开-Python中的打开文件对话框(转)
1.最早学习Tkinter的时候,在<Tkinter编程代码实例>中看到的"打开文件对话框"需要用到FileDialog模块,代码非常简单: from Tkinter ...
- C#打开文件对话框和文件夹对话框
打开文件对话框OpenFileDialog OpenFileDialog ofd = new OpenFileDialog();ofd.Filter = "Excel文件(*.xls;*.x ...
- QT三种窗口、调试终端信息打印、新建菜单、设置窗口标题名称、界面初始化、打开文件对话框、保存文件对话框
三种窗口 QMainWindow:主窗口程序(创建菜单) QWidget:部件窗口 QDialog:对话框窗口 调试终端信息打印 #include <QtDebug>qDebug < ...
- JS实现HTML上用button打开文件对话框
JS实现HTML上用button打开文件对话框 在HTML上有一button,点这个button的话,可以弹出文件选择的对话框,用ActiveX实现的,源码如下: Code 1<HTML> ...
- 如何找到文件的家-打开文件对话框openFileDialog
private void button1_Click(object sender, EventArgs e){openFileDialog1.Filter = "*.txt|*.txt&qu ...
- vc 添加打开文件对话框并读取文件
1.创建打开文件对话框: CFileDialog dlg(TRUE,//TRUE是创建打开文件对话框,FALSE则创建的是保存文件对 ...
最新文章
- 如何才能识别市场趋势?[转]
- WebView你真的熟悉吗?看了才知道
- Dynamics AX 2012 R2 外部程序运行在没有AD的环境(如PDA) 调用AX服务
- 解决MAC系统升级导致COCOAPODS失效问题
- 使用 vue-i18n 切换中英文
- 斯特林发动机图纸尺寸_南昌教学模型订做,航空发动机模型_境海模型
- mysql show
- Python版24点游戏
- 【工程项目经验】Bash On Windows(WSL)无法运行32Bit程序
- C++自学21:动态分配内存(malloc/calloc/realloc/new)/回收内存(free/delete)
- 软件_matplotlib绘图跳过时间段的处理方案[博]
- spring boot开发环境搭建
- android自定义ViewPager之——3D效果应用
- 超快的前端引擎——artTemplate-3.0
- ViewStub使用
- linux查看设备网卡型号,linux查看网卡型号
- React脚手架项目示例
- 电驴v1.2.2.45574最新版官方下载
- FFMpeg 常用命令格式转换,视频合成
- 爬虫框架开发(4)--- 项目实战——新浪滚动新闻资讯实时数据采集
热门文章
- C++函数后置返回类型
- 用java编写一个图书管理系统_手把手教你编写第一个java程序
- 图解C语言的希尔排序
- 代码内查找函数引用_叮~~二级操作题 excel常考函数大梳理
- go语音protobuf_golang 使用 protobuf 的教程
- 自适应 幻灯片代码 app_字节跳动 To B 再添一员,将推出飞书文档独立App | 36氪独家...
- springboot 获取登录浏览器_java项目部署到linux服务器,微信小程序后台springboot项目部署到云服务器(图文详解)...
- linux修改文件没有备份文件,linux文件或目录权限修改后如何恢复(备份了权限就能恢复)...
- idea 自动生成mybaits_怎么让idea自动创建mybatis配置文件
- 同底数幂比较大小方法_知识体系构建:初中数学4大知识点及10大解题方法总结(干货)...