2010-03-21 61 views
3

我在某些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

回答

5

在此處,它被炸燬:

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表示敬意。

1

難道是2003年的防火牆問題嗎?