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本身来说还是没问题的,由于安装多个开发环境造成的冲突是本问题出现的原因。



版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 05:00:37

MFC程序打开文件对话框出错的问题解决的相关文章

VS MFC CFileDialog类 打开文件对话框和另存为对话框

1 explicit CFileDialog( 2 BOOL bOpenFileDialog, 指定的参数创建哪种类型的对话框. 设置到构造 文件已打开 对话框的 TRUE. 设置到构造 保存文件 对话框的 FALSE. 3 LPCTSTR lpszDefExt = NULL, 默认的文件扩展名. 如果用户在文件名框中不包括包含在用户的计算机上的关联) 的已知扩展 (一,lpszDefExt 指定的扩展自动追加到文件名. 如果此参数是 NULL,扩展不是追加. 4 LPCTSTR lpszFil

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

private void button1_Click(object sender, EventArgs e) { openFileDialog1.Filter = "*.txt|*.txt";//设置文件 DialogResult dr = openFileDialog1.ShowDialog();//显示打开文件对话框 if (dr ==DialogResult.OK) { richTextBox1.Text = System.IO.File.ReadAllText(openFile

MFC程序实现给对话框加入?背景图片

1.插入一个Bitmap的资源图片,如果资源名称为:IDC_BITMAP1 2.在CXXXDialog::OnPaint()中实现: void CMyDialogDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中 int cx

WebBrowser自动填充打开文件对话框

WebBrowser自动填充打开文件对话框 在使用WebBrowser编写自动表单填写软件的时候,不知道大家是否遇到国填写文件选择表单的情况.遇到这种情况的时候,无法直接队Html元素赋值,必须模拟手工选择的办法(是否有其它解决办法,不得而知),下面我们来说一下我的解决办法,如下: 1.先说一下正常表单的填写方式,在Delphi+WebBrowser的环境下,可采用如下代码: 1 WebBrowser.OleObject.document.all.item('XXX', 0).value :=x

QT 打开文件对话框总结

Qstring fileName = QFileDialog::getOpenFileName(this, tr("open file"), " ",  tr("Allfile(*.*);;mp3file(*.mp3)")); 说明:这样就会产生一个对话框,和系统的资源管理器差不多的.返回的是你选择文件的 绝对路径. 参数1:父窗口 参数2:对话框的标题 参数3:默认的打开的位置,如"我的文档"等 参数4:文件的过滤器,注意文

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

转自:http://blog.csdn.net/halibobo520/article/details/3371944 1.创建打开文件对话框:                                   CFileDialog dlg(TRUE,//TRUE是创建打开文件对话框,FALSE则创建的是保存文件对话框                                  ".txt",//默认的打开文件的类型                              

MFC程序实现给对话框添加背景图片

1.插入一个Bitmap的资源图片,假设资源名称为:IDC_BITMAP1 2.在CXXXDialog::OnPaint()中实现: void CMyDialogDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中 int cx

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

1 package com.soft.test; 2 3 //AWT: FileDialog类 + FilenameFilter类 可以实现本功能 4 //Swing: JFileChooser类 + FileFilter类 可以实现本功能 5 // 6 //该类用来测试打开文件和保存文件的对话框 7 8 import java.awt.*; //为了使用布局管理器 9 import java.awt.event.*;//用来处理事件 10 import javax.swing.*; //最新的

在终端中用默认程序打开文件(转)

在Linux环境下工作,大部分时间都是在与终端打交道,经常会遇到要查看某个文件,比如一个图片或者一个word文档(不能在终端中直接查看的).这时 通常的做法是切换到gui界面,到文件所在的目录,双击想打开的文件.另外一种方法是直接在shell中输入指定的程序打开文件,比如: evince xx.pdf 查看某个pdf文件.当然这样做的前提是你得记得住那些程序的名字,比如你能记得住用LibreOffice打开一个word文件的命令吗?反正我是记不 住. 在图形界面中已经定义了很多默认的文件打开方式