我在某些Windows 2003服务器上遇到Delphi应用程序问题。它使用webservice调用来连接另一台服务器并来回传输数据。一旦应用程序进入Authenticate方法,应用程序就会死亡。该应用程序已经使用Win Server 2003在以前的盒子上工作多年,但它不适用于新建的机器。这些机器在大多数情况下都以相同的方式设置,但显然有一些配置设置不同,我无法追踪。此外,虽然在对Authenticate的调用中错误变得明显,但是数据包嗅探证明应用程序和它试图联系的服务器之间没有任何事情发生,这加强了我的想法,即在设置连接的早期就会死亡。我无法在本地复制错误,因此我无法在调试器中单步调试应用程序。有关为什么Indy 9 Delphi网络连接可能会无声地失败的任何想法?
答案 0 :(得分:6)
这是爆炸的地方:
MySoapObject := GetNewSoapObject(usewsdl, addr, FHTTPRIO);
...
if MySoapObject <> nil then
MySoapObject.SomeFunction(); // BOOM! Access Violation here.
找到解决方案!原来是DEP(数据执行预防)。当我用Delphi2007肥皂库重新构建代码时,问题就消失了。由于我不想这样做(反序列化导致服务器阻塞我们的XML),而且我的mgr真的不想这样做(涉及广泛的回归测试),我寻找SOAP之间的差异D2005和D2007之间的源代码,旨在针对两者之间的不同做出有针对性的改变。找到有所作为的差异。 Beyond Compare是我的伙伴。 RIO.PAS现在包括一个新单元PrivateHeap.pas,其中一种变化很奇怪。想知道为什么,我用谷歌搜索并发现类似的问题,解释似乎是正确的目标。
DEP 问题基本上就是这个问题 从Windows XP Service Pack开始 2,如果你的硬件能够, Windows将阻止代码的执行 来自非可执行的内存。 不幸的是Delphi SOAP运行时 创造了一堆thunk和the 为这些分配的内存不是 标记为可执行所以当OS 更新发布了有能力 硬件,你什么时候得到 AV 调用RIO支持的方法 成分即可。这个问题已经解决了 使用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。
答案 1 :(得分:1)
可能是导致2003年出现问题的防火墙吗?