我有一個Windows窗體(.net 3.0)項目,由於DEP錯誤,無法在我的客戶的Vista計算機上運行。它在我的vista機器上運行,並在虛擬機中運行在vista sp1的乾淨版本中。我無法跟蹤使我的程序DEP,數據執行保護兼容的方法。我真的不能爲終端用戶機器做任何事情,它只需要運行。有沒有什麼辦法擺脫這種最新的Vista開發噩夢?我的程序使用devexpress控件,sql express和.net即web瀏覽器控件。我已經跳過ie控制,但無濟於事。我有其他程序在同一臺機器上使用devexpress和sql express,並且它們運行正常。我無法在用戶的計算機上進行調試。如何讓我的程序DEP兼容?
回答
DEP
更多信息運行在兩種模式中的一種:
1)硬件DEP是針對能標記內存頁爲不可執行的CPU。這有助於防止某些漏洞,如緩衝區溢出。
2)軟件DEP適用於沒有硬件DEP支持的CPU。它不會阻止在數據頁面中執行代碼,而是停止SEH覆蓋(另一種類型的攻擊)。
在支持CPU的Windows XP上,硬件DEP在默認情況下僅對某些Windows系統二進制文件啓用,對於選擇「選擇加入」的程序也會啓用。
在支持CPU的Vista上,幾乎所有進程都默認啓用硬件DEP。這可能偶爾會出現問題,通常適用於較舊的程序和驅動程序,以及尚未進行Vista測試的ISV。
所以我懷疑第一步是要發現你是否正在處理軟件或硬件DEP。另外,你使用C#/ VB還是託管C++?你是否使用任何本地代碼或組件?如果您的應用程序使用原生組件或使用舊ATL框架構建的ActiveX控件,那麼很可能您的應用程序將因硬件DEP而失敗。
由於.NET Framework 2.0 SP1,我相信C#編譯器會發出DEP兼容的託管代碼。但是,如果您的應用程序正在生成DEP異常,那麼您可以嘗試清除IMAGE_DLLCHARACTERISTICS_NX_COMPAT標誌以查找可執行文件。要做到這一點,你使用EDITBIN.EXE從VC工具集,像這樣:
editbin.exe /NXCOMPAT:NO <your binary>
如果你使用Visual Studio,您可以添加一個生成後步驟,以您的可執行的項目。您需要設置環境,以便EDITBIN的依賴關係得以解決。當我使用本機代碼作爲我的應用程序的一部分,生成後步驟是這樣的:
call $(DevEnvDir)..\tools\vsvars32.bat
editbin.exe /NXCOMPAT:NO $(TargetPath)
從試圖弄清楚你的程序在哪裏以及如何失敗開始。你可以在你的系統上覆制這個問題嗎?在系統上爲應用程序啓用DEP?當您可以複製問題並獲取錯誤(訪問衝突)時,您可以考慮修復程序。
這是一個完全不透明的情況。我沒有從Vista獲得細節,我沒有在系統上調試。該程序在我的開發vista機器和乾淨的vista虛擬機上運行良好。 – 2008-12-08 21:56:12
老版本的ATL沒有感知到DEP,所以如果你使用任何使用ATL構建的ActiveX控件,並且構建在該版本的ATL(版本7.1及以下版本,我認爲)上,你會得到DEP錯誤。
作爲最後的手段,您實際上可以通過調用API函數來禁用DEP:SetProcessDEPPolicy
。上SetProcessDEPPolicy
與在可執行文件標題上NXCOMPAT標誌.NET 2.0 SP1反過來附帶的編譯器。通過使用/ NXCOMPAT:NO選項運行EditBin.exe,您可以在Post Build步驟中關閉該標誌。
FWIW,值得明確提及的是,在很多情況下,應用程序並不是「與DEP不兼容」,而是即將崩潰,DEP「爲保存一天而努力」。很多時候,一旦你禁用了DEP,你會發現你正在播放一個「普通」的AV。
如果您的項目完全是在.NET 3.0中編寫的,那幾乎可以肯定是這種情況,因爲.NET不會執行觸發DEP的任何「瘋狂」事情(例如函數thunking等)。
要進行調試,請安裝調試器或啓用Watson生成.DMP文件,然後將該.DMP文件發送到開發人員的計算機並找出錯誤。
- 1. DEP兼容Visual Studio應用程序
- 2. 如何讓我的應用程序與智能電視兼容?
- 3. 如何讓我的Web應用程序iPhone 5兼容?
- 4. ATL與DEP fixable不兼容嗎?
- 5. 如何測試我的應用程序是UNICODE兼容還是不兼容?
- 6. 如何讓android應用程序兼容多個平臺
- 7. 我應該讓iPhone應用程序向後兼容iOS 5嗎?
- 8. 如何使我的WP8應用程序兼容WP7.8
- 9. 如何使我的ios應用程序sdk向下兼容
- 10. 如何更新我的iOS 6或6.1兼容應用程序?
- 11. 如何使我的iPhone應用程序與iOS 4兼容?
- 12. 如何在C++/Win32中禁用我的程序的程序兼容性助手?
- 13. 如何讓love2d遊戲兼容
- 14. 如何讓three20與iOS 3.1兼容?
- 15. 如何讓Zepto與Browserify兼容?
- 16. 如何讓端點與Silverlight 4兼容?
- 17. 如何讓我的Delphi代碼與多個平臺兼容?
- 18. 如何讓我的CSS代碼與所有瀏覽器兼容?
- 19. 如何讓我的頁面與IE兼容?
- 20. 如何讓我的VSIX文件與VS11和VS2010兼容?
- 21. android:versioncode和android:versionname如何讓我的sdk兼容
- 22. 如何讓我的HTML5佈局與IE兼容? (ActiveX阻止?)
- 23. 我如何修復黑莓應用程序提交兼容性?
- 24. 如何讓iPhone4和iPhone5以下版本的應用程序兼容?
- 25. 如何讓Android應用程序兼容不同的屏幕分辨率?
- 26. 不兼容的設備,如何兼容?
- 27. 管理程序兼容性
- 28. 使用程序兼容性
- 29. 兼容性移植程序
- 30. 與程序兼容性
我有困難,並專門用於(editbin.exe不在工具,所以我複製它): 調用「C:\ Program Files文件\微軟Visual Studio 9.0 \ Common7 \ Tools \ vsvars32.bat」 editbin.exe/NXCOMPAT :沒有「$(TargetPath)」 TY對於真棒回答,將回到您的客戶結果。 – 2008-12-08 22:55:18
好極了,這就是答案。 – 2008-12-09 00:20:24
在路徑中添加引號,從而阻止VS2010執行 – Ulterior 2013-04-21 09:10:21