[問題] VC開啟檔案對話視窗崩潰

看板C_and_CPP (C/C++)作者 (涼雨)時間15年前 (2010/11/26 11:19), 編輯推噓3(3018)
留言21則, 2人參與, 最新討論串1/1
目前使用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)

11/26 14:56, , 1F
這個就是第二種OpenFileName,我試過了

11/26 14:57, , 2F
我不知道你說的 mfc 版本問題要如何重現
11/26 14:57, 2F
第一種比較難試,因為是因為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)

11/26 16:49, , 3F
CFileDialog 那個大陸人說的狀況,應該是因為他用了舊版
11/26 16:49, 3F

11/26 16:50, , 4F
MFC跟新版PSDK不相容才會出現吧,難道你用2008了還會遇到
11/26 16:50, 4F

11/26 16:51, , 5F
第二種是XP SP2跟Adobe Reader 7兩個的問題,一般使用者
11/26 16:51, 5F

11/26 16:51, , 6F
不可能幫他們修補,會碰到這問題的人自己去更新就好
11/26 16:51, 6F

11/26 16:52, , 7F
GetOpenFileName都已經是OS的API了,怎能找到替代
11/26 16:52, 7F

11/26 20:52, , 8F
CFileDialog就是因為用了新版本才會有問題,因為他呼叫
11/26 20:52, 8F

11/26 20:52, , 9F
舊的dll,裡面結構比較小...,所以大陸人才會取消VC的def
11/26 20:52, 9F

11/26 20:53, , 10F
強迫用舊版。新的mfc改成傳指標,所以不會有問題,但不太
11/26 20:53, 10F

11/26 20:53, , 11F
可能叫客人還要抓東西。第二個方法也是,客人會覺得自己
11/26 20:53, 11F

11/26 20:53, , 12F
更新太麻煩,也不想~~~ 我在想想辦法,感謝你!!
11/26 20:53, 12F

11/26 20:58, , 13F
我還是不懂耶,客人只是使用你建立的執行檔而已,編譯者是
11/26 20:58, 13F

11/26 20:58, , 14F
你,你只要用新版MFC就好,你也說你正在用2008了,怎會還
11/26 20:58, 14F

11/26 20:59, , 15F
要客人抓東西?如果是客戶電腦沒新版mfc.dll,你附上就好
11/26 20:59, 15F

11/26 21:19, , 16F
喔喔,我本來是想說作成一個EXE,不要再附加檔案,因為
11/26 21:19, 16F

11/26 21:20, , 17F
想說這樣子就不用更新mfc的dll給客人,了解了,多謝
11/26 21:20, 17F

11/26 21:22, , 18F
之前會那樣講是因為我編譯新版mfc,但客人電腦mfc的dll是
11/26 21:22, 18F

11/26 21:22, , 19F
舊的,所以當我去動態抓取dll的函式,丟資料過去就會有
11/26 21:22, 19F

11/26 21:23, , 20F
我這邊的定義是新的結構(更大),客人的是舊的dll(定義
11/26 21:23, 20F

11/26 21:23, , 21F
較小),我是有成弄靜態static包進去。
11/26 21:23, 21F
文章代碼(AID): #1CxoT4zo (C_and_CPP)
文章代碼(AID): #1CxoT4zo (C_and_CPP)