4

我在某些 Windows 2003 服务器上遇到了 Delphi 应用程序问题。它使用 Web 服务调用来连接另一台服务器并来回传输数据。一旦应用程序进入 Authenticate 方法,应用程序就会死掉。该应用程序已经在以前的带有 Win Server 2003 的机器上运行了多年,但它不能在新构建的机器上运行。大部分机器的设置方式相同,但显然有一些不同的配置设置我无法追踪。此外,虽然错误在对 Authenticate 的调用中变得很明显,但数据包嗅探证明应用程序和它试图联系的服务器之间没有发生任何事情,这加强了我的想法,即在建立连接的早期有些东西会死掉。我不能在本地复制错误,所以我可以' t 在调试器中单步执行应用程序。关于为什么 Indy 9 Delphi Web 连接可能会静默失败的任何想法?

4

2 回答 2

7

这是它爆炸的地方:

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

找到解决方案!原来是DEP(数据执行保护)。当我用 Delphi2007 肥皂库重新构建我们的代码时,问题消失了。由于我不想这样做(反序列化导致服务器阻塞我们的 XML 的问题),而且我的经理真的不想这样做(涉及广泛的回归测试),我寻找 SOAP 之间的差异D2005 和 D2007 之间的源代码,其想法是对两者之间的不同之处进行有针对性的更改。即找到产生差异的差异。 Beyond Compare是我在这里的伙伴。有一种变化很奇怪——RIO.PAS 现在包括一个新单元 PrivateHeap.pas。想知道为什么,我用谷歌搜索并发现了一个类似的问题,其解释似乎是正确的。

DEP问题基本上是从 Windows XP Service Pack 2 开始,如果您的硬件有能力,Windows 将阻止执行来自不可执行内存的代码。不幸的是,Delphi SOAP 运行时创建了一堆 thunk,并且为这些分配的内存没有标记为可执行。因此,当操作系统更新在功能强大的硬件上发布时,您会在调用由 RIO 组件支持的方法时获得 AV。此问题已在 PrivateHeap 单元的更新中得到解决。
-- 让-玛丽·巴贝特
http://delphigroups.info/2/11/344230.html

答对了!现在这是棘手的地方。DEP 一直在我们的服务器上启用。所以起初,这似乎不太可能。但是 DEP 很棘手,新硬件比旧硬件更强大。所以我认为我们过去解决了 DEP 问题,现在更新的硬件让我们陷入困境。我们的服务器管理员关闭了 DEP 保护(对于第 3 方应用程序),重新启动,我们的旧代码正常工作!虽然我们最终会迁移到更新的库,但这对我们来说将是一个很好的短期修复,因为它让我们避免了回归测试这个可以正常工作的应用程序。

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

于 2010-03-25T18:15:28.203 回答
1

会不会是防火墙导致 2003 出现问题?

于 2010-03-22T11:45:19.187 回答