危险的两个函数GetCurrentDirectory和GetParent
最近這段時間用vc做了一個客戶端程序,好長時間不做這種程序了,很是生疏,由于接手的別人的二手項目,大部分代碼都已經完成了,只是跑起來問題很大,很多意料之中和意料之外的問題讓人又愛又恨。其中遇到了兩個函數造成的奇怪問題,好好分析找到了原因,都是一些平時不注意,對一些函數錯誤的使用造成的。下面說說這兩個函數。
1、GetCurrentDirectory
DWORD WINAPI GetCurrentDirectory(__in DWORD nBufferLength,__out LPTSTR lpBuffer );這個是函數原型,他是主要是作用是獲取程序的當前目錄,大部分指的是當前運行程序所在的運行目錄。記得這個地方說的是大部分情況,不是所有,有些特殊的情況會返回時其他的路徑。我們的程序在運行中需要有監護程序來引導,當我寫完監護程序讓他引導進入主程序的時候發現了奇怪的問題,程序整個界面打亂,一張圖片都沒有,去目錄下查找圖片存在,而且直接運行主程序沒有這個問題。我們在主程序里面跟蹤也沒有頭緒,每個函數都運行的正常的出奇,沒有一點不妥的。可是就是在監護程序引導的情況下出現異常。經過判斷感覺是路徑發面出現問題,導致找不到圖片。我們查看獲取路徑的函數,發現使用了GetCurrentDirectory,這個獲取當前目錄的函數按照常理應該沒有問題,細想我們是在監護程序里面使用的shell把主程序調用起來的,應該是忘記了設置工作目錄造成的吧,于是修改監護程序,設置工作目錄,依舊無果,特殊調試發現這個函數獲得的路徑是監護程序的位置,看來這個GetCurrentDirectory函數本身應該是出了問題,我們使用的錯誤。后來查看了一些資料,微軟也承認這個函數有時候不是那么恰當,他的這個獲取的值收到很多的影響,所以如果只是為了獲取當前程序運行路徑,建議使用GetModuleFileName這個函數來處理,這個比較準,因為他獲得是當前運行程序的存儲路徑。我們的程序也是使用這個之后恢復正常的。
2、GetParent
這個函數就本身使用來說是沒有什么問題,只是我們有些時候在開發桌面應用程序的時候需要用的某個窗口置頂的問題,通常解決方法就那幾個setforegroud之類的,可是這些問題都受制于如果你的父窗口不直前你也別想在最前面,所以通常會用SetParent(NULL)函數來搞掉父窗口。當搞掉父窗口之后GetParent函數也就廢掉了,獲取的值是NULL的。很多時候在vc里面操作父類的界面都需要拿到父類的句柄,然后再獲取父類里面的某些控件的值,例如子窗口獲取父類列表當前選中的值。當窗口不值錢,用GetParent一切ok,后來為了置前弄了SetParent(NULL),編譯無措,運行時候系統告訴你無效句柄,呵呵,這個問題好調出來,但是如果bug奪得焦頭爛額的時候也是很難被發現的。對于這個的建議我們還是建議在基類里面默認設置一個包含父類句柄的變量,這樣直接用就ok了。
上面的這些問題都是一些不良的編程習慣或者隨意猜測函數弄出來的問題,總結上面的問題以后我再開始一個大型的c++項目之前一定要做好前期的設計,基礎框架要做好,充分的用好幾個好的設計模式,集中管理一些資源,界面等容易出現泄露問題的。等這個項目結束之后總結一些在大型C++項目里面基礎框架必須包含的東西來分享一下。
總結
以上是生活随笔為你收集整理的危险的两个函数GetCurrentDirectory和GetParent的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对ExtendedWebBrowser的
- 下一篇: 远程控制计算机,但是不能拷贝远程计算机的