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本身来说还是没问题的,因为安装多个开发环境造成的冲突是本问题出现的原因。
MFC程序打开文件对话框出错的问题解决的更多相关文章
- 4.使用CFileDialog打开文件对话框,获得文件路径 -windows编程
引言:没想到2022年还有很多工业软件公司依然使用MFC,微软也一直在更新MFC的库,这次使用MFC封装的CFileDialog类,写一个获得选定文件路径,名称,扩展名的程序. 个人技术博客(文章整理 ...
- 打开文件对话框在xp和win7上的实现文件任意多选
作者:朱金灿 来源:http://blog.csdn.net/clever101 在xp系统上进行文件多选,实际上其文件字符串数组的缓冲区是有限,并不能支持选择任意多个文件,为此以前我还写过一篇文章: ...
- VS2012下自定义打开文件对话框
VS2012下自定义打开文件对话框,MFC的CFileDialog封装了太多,太复杂,绕得头晕,自己封装一个得了 #pragma once #include <objbase.h> #in ...
- java中文件保存、打开文件对话框
package com.soft.test; //AWT: FileDialog类 + FilenameFilter类 可以实现本功能 //Swing: JFileChooser类 + FileFil ...
- QT 打开文件对话框汇总
Qstring fileName = QFileDialog::getOpenFileName(this, tr("open file"), " ", tr( ...
- qt: 系统默认程序打开文件或者软件;
Qt提供了QDesktopServices类, 可以利用openUrl函数调用默认程序打开文件: 源码参考: #ifdef Q_OS_WIN32 m_szHelpDoc = QString(" ...
- C# OpenFileDialog打开文件对话框(详解)
一.打开文件对话框(OpenFileDialog) 1. OpenFileDialog控件的基本属性 InitialDirectory:对话框的初始目录 Filter: 获取或设置当前文件名筛选器字符 ...
- [javaSE] GUI(打开文件对话框)
使用FileDialog可以打开文件对话框,根据模式不同,可以分为打开文件和保存文件对话框 获取FileDialog对象,new出来,参数:所属Frame对象,String的标题,FileDialog ...
- Qt打开文件对话框
项目中需要打开文件对话框,就查了一下,不得不说Qt的帮助文档做的真好,非常详细.要实现这个功能有两种方式,使用QFileDialog的静态方法,实例化QFileDialog对象. 基本算是照抄帮助文档 ...
随机推荐
- catalina配置参数
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.por ...
- 洛谷 1196 [NOI2002]银河英雄传说【模板】带权并查集
[题解] 经典的带权并查集题目. 设cnt[i]表示i前面的点的数量,siz[i]表示第i个点(这个点是代表元)所处的联通块的大小:合并的时候更新siz.旧的代表元的cnt,路径压缩的时候维护cnt即 ...
- Farthest Nodes in a Tree (求树的直径)
题目链接,密码:hpu Description Given a tree (a connected graph with no cycles), you have to find the farthe ...
- MySQL存储过程中一直困扰的 の 变量中的@
在声明变量中CREATE function Get_StrArrayLength ( @str varchar(1024), --要分割的字符串@split varchar(10) --分隔符号)re ...
- JSP菜鸟之困
我一直想把java一套系统学好... 之前寒假学了android......feel good 大四又把jsp补习了一边.....85 但是苦于没有做过实例..... 暑假学PS之间想恶补一下jsp. ...
- python基础——1(简介与变量)
目录 一.编程语言介绍 1.1.机器语言: 1.2.汇编语言: 1.3.高级语言: 二.安装python解释器 2.1.验证python解释器的安装 2.2.设置环境变量 三.执行python程序的两 ...
- cxLookupCombobox的多字段模糊匹配
查了网上很多资料,懒人输入:通过程序使用过滤对话达到自己的目的: 用到cxFilter单元: cbb_DoctorOrder.Properties.View.DataController.Filter ...
- 前端开发利器webStorm 3.0配置使用
安装了phpstorm之后,想配置svn,结果在file->settings->Version Contorl->subversion->with conmand line ...
- hihoCoder#1127 二分图三·二分图最小点覆盖和最大独立集
原题地址 主要是介绍了两个定理: 1. 二分图最大匹配数 = 二分图最小点覆盖数 2. 二分图最小点覆盖数 = 二分图顶点数 - 二分图最小点覆盖数 注意,都是二分图 代码:(匈牙利算法) #i ...
- POJ 1635 树的最小表示法
题目大意: 用一堆01字符串表示在树上走动的路径,0表示往前走,1表示往回走,问两种路径方式下形成的树是不是相同的树 我们可以利用递归的方法用hash字符串表示每一棵子树,然后将所有子树按照字典序排序 ...