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

  1. MFC中打开文件对话框:CFileDlg

    MFC中打开文件对话框:CFileDlg CFileDialog 文件选择对话框的使用:首先构造一个对象并提供相应的参数,构造函数原型如下: CFileDialog::CFileDialog( BOO ...

  2. MFC中的文件对话框类CFileDialog详解

    目录 文件对话框的分类 文件对话框类CFileDialog 对话框选项常用属性(实例:dialog) 对话框常用方法 文件对话框实例 文件对话框的分类       文件对话框分为打开文件对话框和保存文 ...

  3. windows api打开文件对话框

    用windows api 写打开文件对话框主要使用OPENFILENAME ,GetOpenFileName, GetSaveFileName; 1.OPENFILENAME 结构体介绍:要使用Get ...

  4. python打开-Python中的打开文件对话框(转)

    1.最早学习Tkinter的时候,在<Tkinter编程代码实例>中看到的"打开文件对话框"需要用到FileDialog模块,代码非常简单: from Tkinter ...

  5. C#打开文件对话框和文件夹对话框

    打开文件对话框OpenFileDialog OpenFileDialog ofd = new OpenFileDialog();ofd.Filter = "Excel文件(*.xls;*.x ...

  6. QT三种窗口、调试终端信息打印、新建菜单、设置窗口标题名称、界面初始化、打开文件对话框、保存文件对话框

    三种窗口 QMainWindow:主窗口程序(创建菜单) QWidget:部件窗口 QDialog:对话框窗口 调试终端信息打印 #include <QtDebug>qDebug < ...

  7. JS实现HTML上用button打开文件对话框

    JS实现HTML上用button打开文件对话框 在HTML上有一button,点这个button的话,可以弹出文件选择的对话框,用ActiveX实现的,源码如下: Code  1<HTML> ...

  8. 如何找到文件的家-打开文件对话框openFileDialog

    private void button1_Click(object sender, EventArgs e){openFileDialog1.Filter = "*.txt|*.txt&qu ...

  9. vc 添加打开文件对话框并读取文件

    1.创建打开文件对话框:                                   CFileDialog dlg(TRUE,//TRUE是创建打开文件对话框,FALSE则创建的是保存文件对 ...

最新文章

  1. 如何才能识别市场趋势?[转]
  2. WebView你真的熟悉吗?看了才知道
  3. Dynamics AX 2012 R2 外部程序运行在没有AD的环境(如PDA) 调用AX服务
  4. 解决MAC系统升级导致COCOAPODS失效问题
  5. 使用 vue-i18n 切换中英文
  6. 斯特林发动机图纸尺寸_南昌教学模型订做,航空发动机模型_境海模型
  7. mysql show
  8. Python版24点游戏
  9. 【工程项目经验】Bash On Windows(WSL)无法运行32Bit程序
  10. C++自学21:动态分配内存(malloc/calloc/realloc/new)/回收内存(free/delete)
  11. 软件_matplotlib绘图跳过时间段的处理方案[博]
  12. spring boot开发环境搭建
  13. android自定义ViewPager之——3D效果应用
  14. 超快的前端引擎——artTemplate-3.0
  15. ViewStub使用
  16. linux查看设备网卡型号,linux查看网卡型号
  17. React脚手架项目示例
  18. 电驴v1.2.2.45574最新版官方下载
  19. FFMpeg 常用命令格式转换,视频合成
  20. 爬虫框架开发(4)--- 项目实战——新浪滚动新闻资讯实时数据采集

热门文章

  1. C++函数后置返回类型
  2. 用java编写一个图书管理系统_手把手教你编写第一个java程序
  3. 图解C语言的希尔排序
  4. 代码内查找函数引用_叮~~二级操作题 excel常考函数大梳理
  5. go语音protobuf_golang 使用 protobuf 的教程
  6. 自适应 幻灯片代码 app_字节跳动 To B 再添一员,将推出飞书文档独立App | 36氪独家...
  7. springboot 获取登录浏览器_java项目部署到linux服务器,微信小程序后台springboot项目部署到云服务器(图文详解)...
  8. linux修改文件没有备份文件,linux文件或目录权限修改后如何恢复(备份了权限就能恢复)...
  9. idea 自动生成mybaits_怎么让idea自动创建mybatis配置文件
  10. 同底数幂比较大小方法_知识体系构建:初中数学4大知识点及10大解题方法总结(干货)...