导入win32_为什么DLL在导入项没有成功解析时会加载失败?
短答案
因為我們測試過其他方案,只有這種方式是最好的。
長答案
在16位的Windows系統上,如果一個模塊沒有滿足其所有的導入表,則它仍然可以被系統加載。只要你不調用一個丟失的導入項,則一切都還是正常的。如果你嘗試調用一個丟失的導入項,程序將會立即崩潰并顯示”不可恢復的錯誤”的對話框提示。
到了Win32時代,開發團隊覺得這是一個很糟糕的設計,因為有時候人們會將一個為Windows 3.1開發的應用程序拷貝到Windows 3.0上并運行,一開始,這個應用程序運行的還不錯,但是如果這個應用調用了一個只在Windows 3.1平臺上可用的函數時(例如,GetSaveFileName這個函數),應用程序會立即崩潰。
因此Win32開發團隊決定,如果有任何一個導入項沒有被成功解析,則應用程序一開始加載的時候就會失敗。如果上面例子中的應用程序開發商希望能將他們的應用運行在Windows 3.0上,則可以通過顯式地使用GetProcAddress來表明這一點。因為如果必須顯式調用GetProcAddress,則可能需要檢查返回值。
當人們大聲疾呼時,有時會出現此問題:”天哪,我應該有一種方法可以將導入項標記為’可選’-如果無法綁定,則加載應該不會失敗。在調用綁定之前,應用程序有責任驗證綁定是否成功。”,這些人可能是無意中在要求歷史的重演,因為這又會回到我們一開始碰到問題的地方。
總結
如果對一個函數調用在當前平臺上是否可用存在疑慮,可以嘗試先用GetProcAddress來獲取函數地址,如果函數不可用則進行相應的提示或者錯誤處理,盡量地讓你的應用優雅的退出。
總結
以上是生活随笔為你收集整理的导入win32_为什么DLL在导入项没有成功解析时会加载失败?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 成本是手机3倍 LG明年2月开始为iPa
- 下一篇: 谷歌改善 Gboard 输入法横屏体验: