Windows 如何使我的程序DEP兼容?

Windows 如何使我的程序DEP兼容?,windows,winforms,Windows,Winforms,由于DEP错误,我有一个windows窗体(.net 3.0)项目无法在客户的vista计算机上运行。它在我的vista机器上运行,并在虚拟机中的vista sp1的干净版本中运行。我很难找到使我的程序DEP、数据执行预防兼容的方法。我真的不能对终端用户的机器做任何事情,它只能运行。有没有办法摆脱这场最新的vista开发噩梦?我的程序使用devexpress控件、sql express和.net ie web浏览器控件。我已经跳出ie控制,但没有用。我有其他程序在同一台机器上使用devexpre

由于DEP错误,我有一个windows窗体(.net 3.0)项目无法在客户的vista计算机上运行。它在我的vista机器上运行,并在虚拟机中的vista sp1的干净版本中运行。我很难找到使我的程序DEP、数据执行预防兼容的方法。我真的不能对终端用户的机器做任何事情,它只能运行。有没有办法摆脱这场最新的vista开发噩梦?我的程序使用devexpress控件、sql express和.net ie web浏览器控件。我已经跳出ie控制,但没有用。我有其他程序在同一台机器上使用devexpress和sqlexpress,它们运行正常。我无法在用户的计算机上调试此程序。

首先尝试找出程序失败的地方和原因。你能在你的系统上复制这个问题吗?是否在您的系统上启用应用程序的DEP?当您可以复制问题并获得错误(访问冲突)时,您可以考虑修复您的程序


请参阅。

旧版本的ATL不支持DEP,因此,如果您使用任何使用ATL构建的ActiveX控件,并且这些控件都是在该版本的ATL(我认为是7.1及以下版本)上构建的,则会出现DEP错误

作为最后一种手段,您实际上可以通过调用API函数来禁用进程的DEP:
SetProcessDEPPolicy


有关以下两种模式之一的DEP运行的详细信息:

1) Hardware DEP用于可将内存页标记为不可执行的CPU。这有助于防止某些漏洞,如缓冲区溢出

2) 软件DEP用于不支持硬件DEP的CPU。它不阻止在数据页中执行代码,而是停止SEH覆盖(另一种类型的攻击)

在具有支持硬件DEP的CPU的Windows XP上,默认情况下,仅对某些Windows系统二进制文件以及选择“选择加入”的程序启用硬件DEP

在具有支持硬件DEP的CPU的Vista上,几乎所有进程都默认启用了硬件DEP。这有时可能会有问题,通常对于较旧的程序和驱动程序,以及没有进行任何Vista测试的ISV来说

所以我怀疑第一步是要发现你是在处理软件还是硬件部门。你使用C/V/VB还是管理C++?您是否使用任何本机代码或组件?如果应用程序使用本机组件或使用旧ATL框架构建的ActiveX控件,则应用程序很可能会因硬件DEP而失败

从.NETFramework2.0SP1开始,我相信C#编译器会发出与DEP兼容的托管代码。但是,如果应用程序正在生成DEP异常,则可以尝试清除可执行文件的IMAGE\u DLLCHARACTERISTICS\u NX\u COMPAT标志。为此,请使用VC工具集中的EDITBIN.EXE,如下所示:

editbin.exe /NXCOMPAT:NO <your binary>

NET 2.0 SP1附带的编译器在可执行文件头中启用NXCOMPAT标志。在编译后的步骤中,您可以通过使用/NXCOMPAT:NO选项运行EditBin.exe来关闭该标志。

FWIW,值得一提的是,在许多情况下,应用程序并不是“与DEP不兼容”,而是无论如何都会崩溃,DEP“潜入以拯救一天”。通常,一旦禁用DEP,你会发现你正在打一个“普通”的AV

如果您的项目完全是用.NET 3.0编写的,几乎可以肯定是这样的,因为.NET不会做任何触发DEP的“疯狂”的事情(例如函数thunking等)


要进行调试,请安装一个调试器或使Watson生成一个.DMP文件,然后将该.DMP文件带到开发人员的机器上,找出问题所在。

这是一种完全不透明的情况。我没有从vista获得详细信息,系统上没有调试器。该程序在我的dev vista计算机和干净的vista虚拟机上运行良好。我遇到了一些困难,并专门使用了它(editbin.exe不在tools中,所以我复制了它):请调用“C:\program Files\Microsoft Visual Studio 9.0\Common7\tools\vsvars32.bat”editbin.exe/NXCOMPAT:NO“$(TargetPath)”TY以获得令人敬畏的答案,将在客户结果上返回给您。在path周围添加了引号,这阻止了VS2010执行问题在于我必须在程序中使用的旧activex控件。它控制一个仪表,应用程序的主要目的是运行仪表。我无法让供应商使用较新的atl库重建应用程序。该应用程序还必须在所有终端用户机器上运行,我在其中一些机器上遇到了dep错误。我没有直接控制或管理用户机器。一种选择是使用SetProcessDEPPolicy选择加入DEP,而不是使用NXCOMPAT链接器选项。使用SetProcessDEPPolicy启用DEP时,与链接器选项不同,它会使ATL Thunk仿真处于启用状态。这就是IE8如何打开DEP以保持与古代ATL控件兼容。
call $(DevEnvDir)..\tools\vsvars32.bat
editbin.exe /NXCOMPAT:NO $(TargetPath)