??
字號:
《經驗談》
遭遇MFC系統動態鏈接庫失效——我的一次排錯經歷
我的拙作attendance個人考勤軟件在貴網站發表后,陸續有朋友來信提出一些問題,其中有一個朋友告訴我:“下載了您的個人考勤軟件源碼,為什么一運行就出錯誤”,當時因為自己沒有碰到過這樣的問題,答復也就不甚了了,說不到點子上。
昨天,因為又有朋友來問起,我就又翻出attendance個人考勤軟件,運行了一下,結果真就遇見了“一運行就出錯”的問題,下面把我遇到的情況和解決問題的過程介紹出來,可能對曾經碰到過類似問題而不知如何解決的一些朋友會有所幫助和啟發。
我是在DEBUG狀態編譯環境下運行attendance.exe的,一運行就出錯,經過幾次斷點運行以后發現出錯點位置在CAttendanceApp類的InitInstance()函數中的以下代碼行
if (RunEmbedded() || RunAutomated())
從這兒再往下運行一步就出錯,并且報出出錯位置在動態鏈接庫“Mfco42d.dll”中。然后我嘗試作以下改動:
1.程序代碼不加改動,把編譯環境切換到Release狀態下重新編譯運行,結果并不出錯。
2.從VC++開發平臺 點擊“工程-設置”菜單,彈出Project Settings對話窗口中選Win32 Debug的General選項卡,其上有Microsoft Foundation Classes列表框,點其中的下拉箭頭,把原來的“Use MFC in a Shared DLL”改換成“Use MFC a Static Library”。就是把動態庫改換成靜態庫。點“確定”退出。再重新編譯運行就可不再出錯。但這時查Debug目錄下的attendance.exe程序文件的大小將達到2M以上。
3在“Windows資源管理器”中點選“工具-查找-文件或文件夾”菜單,在彈出的查找對話框中查找文件“Mfco42d.dll”發現是在Windows操作系統目錄的System子目錄下。找到這個文件并把它改名(當然要先去掉它的“只讀”屬性),再來運行attendance.exe程序,結果發現用上面1.2.兩種方法編譯出來的attendance.exe程序運行依然正常。但是在Debug狀態下如果仍然采用動態庫編譯出來的attendance.exe程序,運行時就會發生“找不到Mfco42d.dll文件”的錯誤,可見上面1.2.兩種方法編譯出來程序運行時不依賴于外部的Mfco42d.dll庫,毛病就出在Mfco42d.dll文件上了。把它用好的來替換掉,可能會解決問題!
從Mfco42d.dll文件名判斷,它不會是Windows的系統文件,而是VC++的MFC文件,找來VC++的安裝光盤,一找,很幸運,它不曾被塞進打包文件而是與其它的dll文件一起存放在VC98的Debug子目錄下,把它拉過來塞到Windows\System子目錄下再重新編譯運行,OK!全部正常。
自拙作attendance個人考勤軟件發表后,我又作了一些修改,糾正了其中的錯誤,又對程序的功能作了進一步的完善,主要是增加了全年多頁打印功能,是為2.0版,感興趣的朋友仍可到http://www.vckbase.com/code/viewcode.asp?id=1471下載,已經更新。
Yang Lan-guang 2003.8.14
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -