日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/2 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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本身來說還是沒問題的,因為安裝多個開發環境造成的沖突是本問題出現的原因。



轉載于:https://www.cnblogs.com/liguangsunls/p/6839582.html

總結

以上是生活随笔為你收集整理的MFC程序打开文件对话框出错的问题解决的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。