Indy 9和Windows Server 2003不兼容?

问题描述:

我在某些Windows 2003服务器上遇到了Delphi应用程序的问题。它使用web服务调用来连接另一台服务器并来回传输数据。只要应用程序获得Authenticate方法,应用程序就会死亡。这款应用程序在Win Server 2003的早期版本上运行多年,但不适用于新建的机器。大多数机器的设置方式都是相同的,但显然有一些配置设置不同,我无法追踪到。另外,虽然错误在Authenticate调用中变得明显,但数据包嗅探证明应用程序和它正试图联系的服务器之间从未发生过任何事情,这增强了我的想法,即在建立连接时很早就会有某些事情正在死亡。我无法在本地复制错误,因此我无法在调试器中单步执行该应用程序。对于为什么Indy 9 Delphi网络连接可能默默失败的任何想法?Indy 9和Windows Server 2003不兼容?

+1

你是什么意思,“该应用程序死亡”?你能提供具体的细节吗?它会给出错误吗?也许会引发异常? – 2010-03-21 02:36:45

+0

Mike,请编辑/修改问题以删除Indy。也许标题应该是:“Delphi2005 SOAP应用程序在HTTPRIO被调用时死亡(已解决 - DEP问题)”。 – 2010-03-25 18:18:58

在此处,它被炸毁:

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

发现的解决方案!原来是DEP(数据执行预防)。当我用Delphi2007 soap库重新构建代码时,这个问题就消失了。由于我不想这么做(反序列化导致服务器阻塞我们的XML的问题),而且我的管理员真的不想这么做(涉及广泛的回归测试),所以我查找了SOAP D2005和D2007之间的源代码,其中有一个想法是针对两者之间的不同做出有针对性的改变。即找到有所作为的差异。 Beyond Compare是我的朋友在这里。一种变化是奇怪--RIO.PAS现在包含一个新的单位PrivateHeap.pas。想知道为什么,我搜索了一下,发现一个类似的问题,似乎是正确的解释。

DEP问题基本上是自Windows XP的Service Pack 2 , 如果你的硬件能够, Windows将阻止非可执行内存的代码 执行。 不幸的是,德尔福的SOAP运行时 创建了一堆thunk和 内存分配给这些不是 标记的可执行文件。因此,当OS 更新在有能力的 硬件上发布时,当 调用由RIO 组件支持的方法时,您将获得AV。 在PrivateHeap单元更新中解决了此问题。
- 让 - 玛丽·巴伯
http://delphigroups.info/2/11/344230.html

宾果!现在,这里变得棘手。 DEP一直在我们的服务器上启用。所以起初,这似乎不太可能。但是DEP很棘手,新硬件比旧硬件更强大。所以我认为我们在过去遇到过DEP问题,现在新硬件让我们失望了。我们的服务器管理员关闭DEP保护(用于第三方应用程序),重新启动,并且我们的旧代码正常工作!虽然我们最终会迁移到较新的库,但这对我们来说是一个很好的短期修复方案,因为它可以让我们避免回归测试此应用程序,否则就能正常运行。

因此总结:由于数据执行保护(DEP)干扰创建HTTPRIO对象,我们的Delphi2005应用程序在新建的Windows2003服务器上崩溃。 RIO将毫无例外地创建,显得有效。但是当使用关联的IInvokable对象时,它会在尝试根据线路进行通信之前抛出访问冲突。对我们的合作伙伴和非常耐心的管理员,同事麦克马尔,Beyond Compare和Jean-Marie Babet表示敬意。

难道是2003年的防火墙问题吗?