看板 C_and_CPP 關於我們 聯絡資訊
目前使用VC2008開發,想使用開始檔案的對話視窗功能 目前知道有兩種作法,一個是CFileDialog,另一個是OpenFileName 很不幸的,CFileDialog因為mfc版本的問題,導致新舊mfc在某個結構上size大小不同, 很容易造成記憶體讀寫溢位,蓋到其他記憶體的資料,導致程式崩潰 是有查到兩種作法,一個是用new,一個是修改WIN_NT的define 第一種作法我試過,但還是偶爾會掛掉。第二種方法我不是很想用, 除非我以後都不用新版本,所以我改用OpenFileName 但OpenFileName一樣有問題,網路上查是因為pfd.dll之類的會用到com 我不太清楚這個,因為我沒調用com,不過我有照著處理方式做,增加了 CoInitialize(NULL); (CoInitializeEx我在某些電腦調用會掛掉), 雖然變成穩定很多,但是偶爾還是有崩潰的情形發生,不知道有人有方法 解決,或是有更好得API可以使用嗎?? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 203.66.251.14 ※ 編輯: clarkman 來自: 203.66.251.14 (11/26 11:21)
purpose:http://codepad.org/qrPfVsyH 11/26 14:56
這個就是第二種OpenFileName,我試過了
purpose:我不知道你說的 mfc 版本問題要如何重現 11/26 14:57
第一種比較難試,因為是因為mfc的OPENFILENAME結構大小不同的關係,所以要看 剛好在那個結構後面的記憶體資料被蓋掉會不會造成問題 http://zhidao.baidu.com/question/43843597 第二種方法比較好試,開啟開始檔案的對話視窗後,先隨便找一個檔案,滑鼠 移到上面,然後等他浮出檔案的資訊後,選取消,再重開一兩次,就會crash http://blog.csdn.net/dyw/archive/2007/09/02/1768857.aspx ※ 編輯: clarkman 來自: 203.66.251.14 (11/26 16:09)
purpose:CFileDialog 那個大陸人說的狀況,應該是因為他用了舊版 11/26 16:49
purpose:MFC跟新版PSDK不相容才會出現吧,難道你用2008了還會遇到 11/26 16:50
purpose:第二種是XP SP2跟Adobe Reader 7兩個的問題,一般使用者 11/26 16:51
purpose:不可能幫他們修補,會碰到這問題的人自己去更新就好 11/26 16:51
purpose:GetOpenFileName都已經是OS的API了,怎能找到替代 11/26 16:52
clarkman:CFileDialog就是因為用了新版本才會有問題,因為他呼叫 11/26 20:52
clarkman:舊的dll,裡面結構比較小...,所以大陸人才會取消VC的def 11/26 20:52
clarkman:強迫用舊版。新的mfc改成傳指標,所以不會有問題,但不太 11/26 20:53
clarkman:可能叫客人還要抓東西。第二個方法也是,客人會覺得自己 11/26 20:53
clarkman:更新太麻煩,也不想~~~ 我在想想辦法,感謝你!! 11/26 20:53
purpose:我還是不懂耶,客人只是使用你建立的執行檔而已,編譯者是 11/26 20:58
purpose:你,你只要用新版MFC就好,你也說你正在用2008了,怎會還 11/26 20:58
purpose:要客人抓東西?如果是客戶電腦沒新版mfc.dll,你附上就好 11/26 20:59
clarkman:喔喔,我本來是想說作成一個EXE,不要再附加檔案,因為 11/26 21:19
clarkman:想說這樣子就不用更新mfc的dll給客人,了解了,多謝 11/26 21:20
clarkman:之前會那樣講是因為我編譯新版mfc,但客人電腦mfc的dll是 11/26 21:22
clarkman:舊的,所以當我去動態抓取dll的函式,丟資料過去就會有 11/26 21:22
clarkman:我這邊的定義是新的結構(更大),客人的是舊的dll(定義 11/26 21:23
clarkman:較小),我是有成弄靜態static包進去。 11/26 21:23