把最近踩的坑總結一下(1)——二級MSoffice題庫軟件自動更新版本V2.0

1.自動更新的下載功能只在開發機上能夠正常運行,在其餘非win10系統上會出現異常c++

 

        開發機上的下載更新功能正常,可是在兩臺win7和一臺win8.1機器上測試時老是出現上圖的現象。彈出的窗口表示觸發了自定義的異常處理機制,下載器在初始化時出錯了。下載器使用的是迅雷雲開放平臺提供的動態連接庫,由於要在C#中調用動態連接庫中函數,直接使用DllImport使用沒成功,本身用VC++寫了一個動態連接庫把迅雷雲開放平臺的動態連接庫包裝了一下。這個異常提示看不出什麼有用的信息,把異常處理代碼去除後又測試了一下(原諒我這種腦殘般的操做),此次變成下圖這樣的提示:windows

        貌似是個內存錯誤,不過依然不知道什麼問題,捉急!那個經典疑問又來了:在我電腦都好好的呀!多線程

       其實這個時候應該意識到是本身寫的動態連接庫問題,可是當時反應仍是慢了一步。先是在網上百度了一番,未果。而後又以「VS2015編寫的Dll怎樣在win7上使用」爲關鍵字百度了一番,各類答案,衆說紛紜,有的說須要修改項目配置屬性,有的說須要安裝VC++ 2015 Runtime,各類答案都有。死馬當活馬醫,先安裝vc++ 2105 runtime試試,結果失敗。而後又對照一個答案修改以下圖項目屬性裏的若干配置:函數

 

         一通配置事後,再試,直接編譯不經過,報一堆錯,見下圖:工具

 

          看到這個錯誤數量,我也是無語了。還有人說要把動態庫dll改爲靜態庫lib,可是查了一下貌似C#沒法直接使用靜態庫lib。測試

          冷靜一下,仔細觀察了一下。項目配置屬性頁裏的目標平臺版本和平臺工做集分別是8.1和V140,難道和這個有關係?8.1是指這個生成的dll文件只能工做在win8.1及以上系統中?spa

         試着選擇其餘平臺版本,無奈8.1是最低的。後面的平臺工做集也只有兩個選項另外一個選項在以前的試驗中已經試過不起做用。線程

         看來得試試安裝其餘平臺工做集,可是這個平臺工做集沒法單獨安裝。只有安裝相應版本的VS,才能得到對應的平臺工做集。雖然麻煩,可是值得一試。先裝個VS2010試試,安裝完成後,平臺工做集中多處兩個選項,見下圖 debug

        多出1個V100和V90。其餘配置保持不變,選擇V100而後編譯,沒有error和warning,順利經過。而後在兩臺win7和一臺win8.1專業版測試機上替換掉對應的dll文件再次啓動程序,此次沒有異常出現,下載更新功能正常,問題彷佛順利解決。3d

        還有其餘的解決辦法嗎?

 

       上圖是一開始的項目配置,平臺工做集是V140,配置爲debug,運行庫是多線程調試DLL(/MDd)。這個配置狀況下,編譯沒問題,可是在win7和win8.1的測試機上沒法正常工做。

        在保持其餘項目配置不變的狀況下,將平臺工做集改成v100後編譯生成的dll文件在測試機上能夠正常運行。這是我上面所使用解決辦法。如今介紹另外一種解決辦法,無需安裝其餘平臺工做集,只需更改項目配置便可。

        在保持平臺工做集爲V140的狀況下,將配置改成Release,運行庫改成多線程(/MT)。從新編譯生成dll文件,這時會發現dll文件相較以前的變大了。將dll放到測試機上運行功能正常,程序正常運行。

       若是沒有修改項目編譯配置爲Release,而只修改了運行庫,是會編譯出錯的。

 

       爲何會這樣呢?讓咱們回到一開始的配置debug、V140、多線程調試(/MDT)。而後利用Dependency Walker查看依賴庫,在開發機器上是這樣的:

 

 

      在其中一臺win7測試機上是這樣的:

      能夠看到,在win7機器上,除了第一個kernel32.dll依賴庫之外,其餘3個依賴庫都沒有!

       而後咱們把平臺工做集修改成V100,再次生成dll而後使用工具查看,開發機器結果以下圖: 

       依賴庫有所改變,4個變爲3個。

       Win7測試機的狀況以下圖:

         能夠看到,此次所需的依賴庫都有。

        而後,將平臺工做集改回V140,編譯配置改成Release,代碼生成改成多線程(/MT),用工具查看dll所需的依賴庫以下,能夠看到如今依賴庫只剩下一個kernel32.dll,可是相應的,生成的dll文件體積增大到108kB。這中間發生了什麼,還不清楚。

       win7測試機上使用工具查看依賴庫的結果以下圖:

 

       由上面的分析可知,以debug模式編譯,修改平臺工做集可解決問題,可是目標機器須要有另外兩個依賴庫;以release模式編譯並修改生成代碼運行庫也可解決問題,而且目標機器只需有kernel32.dll便可,這是windows系統自帶的。因此建議使用第二種解決方案。

相關文章
相關標籤/搜索