天天看點

無法啟動程式 “E:\練習DLL程式\DLLtest\Debug\DLLtest.dll”

      最近嘗試這寫了一個DLL程式,基本上全部是按照書上的要求進行寫的,但還是出現了錯誤。我想着應該很正常吧,所謂“紙上得來終覺淺,絕知此事要躬行”。其中出現的錯誤就是“無法啟動程式 “E:\練習DLL程式\DLLtest\Debug\DLLtest.dll” ”。

       我覺得事先需要說明的一點是:DLLtest是我建的DLL項目,test是我建的需要用到動态連結庫DLLtest的項目 。

       碰到這個問題後第一個去問的就是百度,百度上給了一個說法是DLLtest項目build之後所生成的DLLtest.dll檔案并沒有放到test.exe檔案所在的檔案夾裡面。但是我的是放進去了的,不過還是有問題。至于說為什麼需要将DLLtest4.dll檔案放到運作檔案所在的檔案夾,Visual C++ 2010 入門經典(第五版)給出了明确的解釋:當程式執行時,要使Windows為程式查找并加載一個DLL,通常要把這個DLL放在Windows System32檔案夾中。如果DLL不在這個檔案夾中,那麼Windows将搜尋包含可執行檔案(這裡是test.exe檔案)所在的檔案夾。如果沒有找到,就會出現一個錯誤消息。

        言歸正傳,還是說這個問題是怎麼解決的吧。後來在我無意中将E:\練習DLL程式\DLLtest\Debug\DLLtest.dll添加到了test項目-屬性-配置屬性-連接配接器-輸入-附加依賴項。在連接配接的時候很顯然的出現了問題,因為是應該把build之後的DLL項目Debug檔案夾下DLLtest.lib檔案夾添加到附加依賴項的。但是問題的報錯内容卻引發了我的思考,錯誤内容是:E:\練習DLL程式\DLLtest\Debug\DLLtest.dll : fatal error LNK1107: 檔案無效或損壞: 無法在 0x2F0 處讀取。當我看到這個錯誤後我想不會是我的DLLtest項目的錯誤吧。。。。無論如何分為兩種情況:第一是我程式寫的有問題。第二是檔案确實無法正确的打開,至于原因是什麼我就不知道了。仔細檢查過自己的程式後發現沒有錯誤,後來百度一下。裡面也是衆說紛纭,關于是第一種情況的解決辦法是因為在test項目的主程式中沒有加#pragma comment(lib,"WS2_32.LIB"),我寫的程式很簡單,就是簡單的字元串輸出,平常寫的程式就沒有添加#pragma comment(lib,"WS2_32.LIB"),我認為錯誤應該不是在沒有添加上面那句話程式,結果試了試,确實還是不行。甚至還有的說是要加上這樣的代碼#pragma comment(lib,"E:\練習DLL程式\DLLtest\Debug\DLLtest.LIB")在test項目主函數之前。然後我又仔細的檢視了Visual C++ 2010 入門經典(第五版),書中比沒有對此操作做介紹,而且在添加外部依賴項的時候,已經明确的給出了.lib檔案的路徑,就像你需要調用printf()函數一樣,你隻需要先#include “stdio.h”即可,相同的原理我想要調用我自己寫的DLL裡面的東西,也是應該隻需要包含相應的頭檔案就行了,即#include "DLLtest.h"。試驗之後發現上面說的加#pragma comment(lib,"E:\練習DLL程式\DLLtest\Debug\DLLtest.LIB")的方法也是錯誤的。然後就是第二種情況的,百度上有的說是因為磁盤的問題,但是按照相應的說法改過之後還是不行。後來還有一種說法是,在解決法案-屬性-通用屬性-外部依賴項,将DLLtest項目設定為test項目的外部依賴,但很顯然也不像是正解,因為系統中那麼多DLL都不在目前解決方案裡面,沒有設定外部依賴項,不還是能夠調用嘛,不過話說回來,系統是系統的,可能有好多自己不知道的東西,是以試了試,結果還是不行。後來無意中看到了解決方案-屬性-通用屬性-啟動項目,竟然預設為在此解決方案中中的第一個項目DLLtest。。。。。。但是我恍然大悟,錯誤原來是在這裡,.dll檔案應該無法運作才對(這句話是否正确有待考證)。然後在預設啟動項下将test項目設定為預設啟動項就好了。

        ╮(╯▽╰)╭,其實這個錯誤很低級的,但是有的時候确實很難發現,希望能夠給那些學習DLL的菜鳥(本人就是)帶來一些幫助。

繼續閱讀