討論區快速選單
知識庫快速選單
軟體開發過程中有哪些資安漏洞? 討論區最近新進100則主題 傑米的攝影旅遊筆記
[ 回上頁 ] [ 討論區發言規則 ]
VS2010 和 DLL
更改我的閱讀文章字型大小
作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2012/7/28 下午 04:19:56
基於很多原因,一直堅守在VC6。
直到看到VS2010的評價似乎不錯,也剛好有一個新案,包袱較少。
所以,就興起試試看的動念。但真的是一路走來,跌跌撞撞...
今天,真的是有"不如歸去"(VC6)的念頭 :(
VC6不是沒有問題,但VC6已經和它相處多年,碰到問題可以駕輕就熟的克服。
VS2010只能說,花俏有餘,出苞不斷,重要的是...要解問題經常是搞到三更半亱...
(多了太多東西,問題被包在太多層裡面,MSDN的文件..唉,說好聽的話,言簡意賅,
難聽一點,就是有說跟沒遻一樣)

不浪費網路資了,以前就發現VC2010的global物件建立時AfxGetApp會失敗。
昨天,一個新開發案到了一個階段,想要整理一下,先給客戶看看樣子。
這個project在debug時就有發現,程式結束時,整個window時是關了,但VS還是處在
debug模式。需要按強制停才能結束debug。
這本也不以為意,因為以前偶也碰到,想應該是VS在debug時不稳。release就不會有問題。
直到,產生release版本的程式,一跑之下,發現程式window關了,但從工作管理員看,
程式還留在記憶體裡面。這讓我大吃一驚!
就這樣從昨天查找到今天,中間睡沒三個小時,最後發現是程式呼叫AfxFreeLibrary時掛住了。

情況是這樣,我有一個常用的類別,這個類別在建構時會載入一個DLL,在解構時自動御載這個DLL。
然後我把這個類別宣告了一個global的物件,預期是,這個物件在建構時會載入DLL,解構時自動御載。
這個類別已在不別的程式運作,不應該有問題。但在使用VC2010的新案上,在御載時,卻掛住了
(呼叫AfxFreeLibrary()回不來)
我把這個類別試了幾個VS2010的project,發現並不是每個都會掛住,只有少數幾個會掛住。
掛住時,我追蹤過,是掛在要除tool button image的程式上,事實上,程式運行到那時,程式碼
的記憶體已經不屬於我的APP instance。應該是已經被系統釋放了。
我猜,整個AP御載的過程和global物件的御載存在著競爭關係,所以有的rpoject不會,有的會。
這真的很傷腦筋,到網路上找,似乎沒有答案,雖然問題抓到了,終究有解,但S2010底還留存
多少和以前不相容的東東要浪費我的生命呢?
還是,誰有這方面的文件說明可以解救我^^
作者 : cxxlman(CxxlMan) C++優秀好手貼文超過1000則
[ 貼文 1042 | 人氣 3227 | 評價 1260 | 評價/貼文 1.21 | 送出評價 28 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2012/7/31 下午 06:47:29
若確定是 自動御載 的問題, 想辦法讓那個 dll 永不御載 就行了^^
作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2012/7/31 下午 09:54:56
>若確定是 自動御載 的問題, 想辦法讓那個 dll 永不御載 就行了
問題找到後就不難解,腦人的是花了不少精神和時間在找問題。
解決的方法,最簡單的就是程式不去御載,程式結束時讓系統自動御載。
但,這有點像留下大便給別人清理,不太合個人衞生習慣^^
而且即然御載有速問題,也不確認系統自動御載就不會出苞。
我是選擇程式結束前主動呼叫AfxFreeibrary,而不再由全域物件解構時自動御載。
就是多了一個呼叫,就怕有時候會忘了。不過,我在該物件結束時檢查如果DLL沒有解構
就提示(ASSERT)要呼叫御載DLL的函式。雖不滿意但可接受。
只是,VS2010到底還有多少未爆彈待處理的?
作者 : daniel(冷眼)討論區板主 VC++優秀好手遊戲程式設計優秀好手DirectX優秀好手C++優秀好手貼文超過1000則人氣指數超過70000點
[ 貼文 1564 | 人氣 84169 | 評價 6990 | 評價/貼文 4.47 | 送出評價 15 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2012/7/31 下午 10:39:08
有些狀態msg control是有問題的
在執行完WM_CLOSE 沒有丟出WM_DESTORY 的訊息
應用程式視窗不見,不過確留在記億體中

像WM_COPYDATA 進程操作或者線程的結束.ETC
都有可能發生結束沒有離開的問題
作者 : sunyear(coco) VC++卓越專家C++頂尖高手貼文超過2000則
[ 貼文 2421 | 人氣 1485 | 評價 6060 | 評價/貼文 2.5 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2012/7/31 下午 11:56:05
>有些狀態msg control是有問題的
微軟從VS2005就號稱,程式員可以把精力全放在自己程式功能上,
但實際上,我用的經驗是,花在debug微軟的問題(包括文件說明不足)比自己的程式多很多。
作者 : cxxlman(CxxlMan) C++優秀好手貼文超過1000則
[ 貼文 1042 | 人氣 3227 | 評價 1260 | 評價/貼文 1.21 | 送出評價 28 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2012/8/1 下午 02:12:34

>>若確定是 自動御載 的問題, 想辦法讓那個 dll 永不御載 就行了
>問題找到後就不難解,腦人的是花了不少精神和時間在找問題。
>解決的方法,最簡單的就是程式不去御載,程式結束時讓系統自動御載。
>但,這有點像留下大便給別人清理,不太合個人衞生習慣^^

一般 dll 的用法就是去連結它的引導 lib 來載入 程式結束才會御載 除非是做一些外掛之類才會去機動式的載入和御載

>而且即然御載有速問題,也不確認系統自動御載就不會出苞。

若連程式結束才御載的方法都會出問題 那表示問題在 dll

>我是選擇程式結束前主動呼叫AfxFreeibrary,而不再由全域物件解構時自動御載。
>就是多了一個呼叫,就怕有時候會忘了。不過,我在該物件結束時檢查如果DLL沒有解構
>就提示(ASSERT)要呼叫御載DLL的函式。雖不滿意但可接受。
>只是,VS2010到底還有多少未爆彈待處理的?

VS2010 我沒用來寫 c++ 我仍還是用 2008 寫 c++ 一來和舊版有相容性的問題 二來我實在不想替 MS 做 debug 實在是 debug 到怕了
 板主 : 青衫 , Raymond
 > Visual C++ - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - Visual C++ - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
Visual C++
1 青衫 11070 
2 Raymond 10090 
3 Clier 7630 
4 小約翰 2500 
5 Cog 2030 
6 coco 1870 
7 aming 1410 
8 牧童哥 1400 
9 r2109 1380 
10 Akira 1350 
Visual C++
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.140625