前几天从网上下了个图像分析的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程序打开文件对话框出错的问题解决的更多相关文章

  1. 4.使用CFileDialog打开文件对话框,获得文件路径 -windows编程

    引言:没想到2022年还有很多工业软件公司依然使用MFC,微软也一直在更新MFC的库,这次使用MFC封装的CFileDialog类,写一个获得选定文件路径,名称,扩展名的程序. 个人技术博客(文章整理 ...

  2. 打开文件对话框在xp和win7上的实现文件任意多选

    作者:朱金灿 来源:http://blog.csdn.net/clever101 在xp系统上进行文件多选,实际上其文件字符串数组的缓冲区是有限,并不能支持选择任意多个文件,为此以前我还写过一篇文章: ...

  3. VS2012下自定义打开文件对话框

    VS2012下自定义打开文件对话框,MFC的CFileDialog封装了太多,太复杂,绕得头晕,自己封装一个得了 #pragma once #include <objbase.h> #in ...

  4. java中文件保存、打开文件对话框

    package com.soft.test; //AWT: FileDialog类 + FilenameFilter类 可以实现本功能 //Swing: JFileChooser类 + FileFil ...

  5. QT 打开文件对话框汇总

    Qstring fileName = QFileDialog::getOpenFileName(this, tr("open file"), " ",  tr( ...

  6. qt: 系统默认程序打开文件或者软件;

    Qt提供了QDesktopServices类, 可以利用openUrl函数调用默认程序打开文件: 源码参考: #ifdef Q_OS_WIN32 m_szHelpDoc = QString(" ...

  7. C# OpenFileDialog打开文件对话框(详解)

    一.打开文件对话框(OpenFileDialog) 1. OpenFileDialog控件的基本属性 InitialDirectory:对话框的初始目录 Filter: 获取或设置当前文件名筛选器字符 ...

  8. [javaSE] GUI(打开文件对话框)

    使用FileDialog可以打开文件对话框,根据模式不同,可以分为打开文件和保存文件对话框 获取FileDialog对象,new出来,参数:所属Frame对象,String的标题,FileDialog ...

  9. Qt打开文件对话框

    项目中需要打开文件对话框,就查了一下,不得不说Qt的帮助文档做的真好,非常详细.要实现这个功能有两种方式,使用QFileDialog的静态方法,实例化QFileDialog对象. 基本算是照抄帮助文档 ...

随机推荐

  1. 万能的搜索--之DFS(二)

    (一)深度优先搜索(DFS) 我们先给出深度优先的解决办法,所谓深度优先搜索,在迷宫问题里就是不撞南墙不回头,能走得深一点就尽量深一点.如果碰到了墙壁就返回前一个位置尝试其他的方向.在<啊哈!算 ...

  2. Django中对接第三方支付(支付宝)实现支付的流程

    1. 业务逻辑准备 1. 使用沙箱提供的商家环境 沙箱环境:是支付宝提供给开发者的模拟支付的环境 沙箱应用:https://docs.open.alipay.com/200/105311 沙箱账号:h ...

  3. MySQL autocommit 和 start transaction

    autocommit 和 start transaction 都是事务相关的命令.类似MyISAM的mysql引擎就不支持. autocommit 默认是ON状态,即sql语句是自动提交的 show ...

  4. Python中的函数(4)

    一.传递列表 你经常会发现,向函数传递列表很有用,这种列表包含的可能是名字.数字或者更复杂的对象(如字典). 将列表传递给函数后,函数就能直接访问其内容. 栗子:假设有一个用户列表,我们要和其中每一位 ...

  5. Saving James Bond - Easy Version 原创 2017年11月23日 13:07:33

    06-图2 Saving James Bond - Easy Version(25 分) This time let us consider the situation in the movie &q ...

  6. loadrunner报错-持续更新

    一.关联使用web_reg_save_param报错 1.以下是网页中需要关联的地方,有2处,通过网页查看源代码可以看: 2.还可以通过Generation Log来查看需要关联的地方: 3. 然后再 ...

  7. spring boot学习01【搭建环境、创建第一个spring boot项目】

    1.给eclipse安装spring boot插件 Eclipse中安装Spring工具套件(STS): Help -> Eclipse Marketplace... 在Search标签或者Po ...

  8. c# 类如何生成dll文件及引用

    1.打开“工具”菜单下的“外部工具”子菜单: 2.点击“添加按钮,增加一个菜单,菜单内容填写如下: 注意参数那里为:/k "C:\vs2010\VC\vcvarsall.bat" ...

  9. [NOIP2001] 提高组 洛谷P1024 一元三次方程求解

    题目描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差 ...

  10. CDQ分治模板

    #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #defi ...