mcm*_*mar 3 delphi dep soap delphi-2007 delphi-2005
我在某些Windows 2003服务器上遇到Delphi应用程序的问题.它使用webservice调用来连接另一台服务器并来回传输数据.一旦应用程序进入Authenticate方法,应用程序就会死亡.该应用程序已经使用Win Server 2003在以前的盒子上工作多年,但它不适用于新建的机器.这些机器在大多数情况下都以相同的方式设置,但显然有一些配置设置不同,我无法追踪.此外,虽然在对Authenticate的调用中错误变得明显,但是数据包嗅探证明应用程序和它试图联系的服务器之间没有任何事情发生,这加强了我的想法,即在设置连接的早期就会死亡.我无法在本地复制错误,因此我无法在调试器中单步调试应用程序.有关为什么Indy 9 Delphi网络连接可能会无声地失败的任何想法?
这是爆炸的地方:
MySoapObject := GetNewSoapObject(usewsdl, addr, FHTTPRIO);
...
if MySoapObject <> nil then
MySoapObject.SomeFunction(); // BOOM! Access Violation here.
Run Code Online (Sandbox Code Playgroud)
找到解决方案 原来是DEP(数据执行预防).当我用Delphi2007肥皂库重新构建我们的代码时,问题就消失了.由于我不想这样做(反序列化导致服务器阻塞我们的XML),而且我的mgr真的不想这样做(涉及广泛的回归测试),我寻找SOAP之间的差异D2005和D2007之间的源代码,旨在针对两者之间的不同做出有针对性的改变.即找到有所作为的差异. 超越比较是我的伙伴.RIO.PAS现在包括一个新单元PrivateHeap.pas,其中一种变化很奇怪.想知道为什么,我用谷歌搜索并发现一个类似的问题,解释似乎是正确的目标.
该DEP的问题基本上是自Windows XP Service Pack 2的,如果你的硬件能够,Windows会阻止非可执行内存执行代码.不幸的是,Delphi SOAP运行时创建了一堆thunk,为这些thunk分配的内存未标记为可执行文件.因此,当在有能力的硬件上发布操作系统更新时,在调用由RIO组件支持的方法时,您将获得AV.在使用PrivateHeap单元的更新中解决了此问题.
- Jean-Marie Babet
http://delphigroups.info/2/11/344230.html
答对了!现在这里变得棘手了.DEP始终在我们的服务器上启用.所以起初,这似乎不太可能.但DEP很棘手,而较新的硬件比旧硬件更强大.所以我认为我们过去已经解决了DEP问题,现在新的硬件正在绊倒我们.我们的服务器管理员关闭DEP保护(对于第三方应用程序),重新启动,我们的旧代码工作!虽然我们最终将迁移到更新的库,但这对我们来说将是一个很好的短期修复,因为它可以让我们避免回归测试这个应用程序,否则工作正常.
总结一下:由于数据执行保护(DEP)干扰了HTTPRIO对象的创建,我们的Delphi2005应用程序崩溃了新建的Windows2003服务器.RIO将毫无例外地创建,似乎有效.但是当使用关联的IInvokable对象时,它会在尝试在线路上进行通信之前抛出访问冲突.感谢我们的合作社和非常耐心的管理员,开发者麦克马,Beyond Compare和Jean-Marie Babet.