我在某些Windows 2003服务器上遇到了Delphi应用程序的问题。它使用Web服务调用与另一台服务器连接并来回传输数据。一旦应用程序进入Authenticate方法,该应用程序就会死亡。该应用程序在Win Server 2003的先前版本中已经使用了多年,但是在新构建的计算机上却没有。机器在大多数情况下都以相同的方式设置,但是显然有一些配置设置不同,我无法跟踪。同样,尽管在对Authenticate的调用中该错误变得很明显,但数据包嗅探表明,在应用程序和它尝试联系的服务器之间什么也没有发生,这使我更加怀疑在建立连接时会早日消亡。我无法在本地复制错误,因此也无法在调试器中逐步执行该应用程序。关于为什么Indy 9 Delphi Web连接可能会默默失败的任何想法?

最佳答案

这是爆炸的地方:

MySoapObject := GetNewSoapObject(usewsdl, addr, FHTTPRIO);
 ...
if MySoapObject <> nil then
  MySoapObject.SomeFunction(); // BOOM! Access Violation here.


找到解决方案!原来是DEP(数据执行保护)。当我用Delphi2007 soap库重新构建代码时,探针消失了。由于我不想这样做(反序列化导致使我们的XML陷入服务器阻塞的问题),而我的mgr确实不想这样做(涉及广泛的回归测试),因此我寻找SOAP之间的差异D2005和D2007之间的源代码,目的是针对两者之间的差异进行有针对性的更改。即找到可以有所作为的差异。 Beyond Compare是我的好友。一种变化是奇怪的-RIO.PAS现在包括一个新单位PrivateHeap.pas。想知道为什么,我用谷歌搜索并发现了一个类似的问题,并给出了正确的解释。


  DEP问题基本上是
  从Windows XP Service Pack开始
  2,如果您的硬件有能力,
  Windows将阻止执行代码
  来自不可执行的内存。
  不幸的是,Delphi SOAP运行时
  创造了一堆的东西,
  分配给这些的内存不是
  标记为可执行文件。所以当操作系统
  更新已发布
  硬件,当
  调用由RIO支持的方法
  零件。此问题已在中解决
  PrivateHeap单元的更新。
  -让·玛丽·贝贝(Jean-Marie Babet)
      http://delphigroups.info/2/11/344230.html


答对了!现在,这里变得棘手。始终在我们的服务器上启用DEP。因此,起初看来,这似乎不太可能。但是DEP棘手,并且较新的硬件比旧的硬件更有能力。因此,我认为我们过去已经摆脱了DEP问题,现在,更新的硬件使我们陷入困境。我们的服务器管理员关闭了DEP保护(适用于第三方应用程序),重新启动后,旧代码正常工作!虽然我们最终将迁移到较新的库,但这对我们来说是一个很好的短期解决方案,因为它使我们避免了对该应用进行正常工作的回归测试。

总结一下:由于数据执行保护(DEP)干扰了HTTPRIO对象的创建,我们的Delphi2005应用程序在新建的Windows2003服务器上崩溃了。 RIO将毫无例外地创建,看起来有效。但是,当使用关联的IInvokable对象时,它会引发访问冲突,然后才尝试在网络上进行通信。开发人员Mcmar,Beyond Compare和Jean-Marie Babet对我们合作且非常耐心的管理员表示敬意。

07-25 23:45
查看更多