• 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 '||'
     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 FilesMicrosoft SDKsWindowsv7.1Include 以下

    当初MFC4.2 的年代应该还没有v7.1 的版本号呀,去看下文件夹设定吧

    v7.1 的include 在最上面。

    果断移到最下。所有又一次生成,没问题啦,奥也。

    自已是否动过这个设定记不清了。亦或是后来装VS2010或DDK的时候影响了??

    总之呢,我们能够觉得。就VC6本身来说还是没问题的,因为安装多个开发环境造成的冲突是本问题出现的原因。

    
  • 相关阅读:
    SQL Server中怎样可以从SELECT语句的结果集中删除重复行
    Comparison method violates its general contract!
    如何解决 不能以 DISTINCT 方式选择 text、ntext 或 image 数据类型
    TortoiseSVN—Repo-browser
    使用BigDecimal完成小数点后的精确位数的四舍五入
    CREATE TABLE 语句后的 ON [PRIMARY] 起什么作用
    sql server 获取每一个类别中值最大的一条数据
    C# 正则表达式
    Linq to XML 读取XML 备忘笔记
    安装双系统需要注意的几个问题
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/6839582.html
Copyright © 2020-2023  润新知