2012-10-31 17 views
5

我正在使用Delphi XE。我遇到了使用Delphi Soap的內存泄漏問題。它原來是由於TWSDLLookup.Destroy失蹤。免費通話,如QC 91160Delphi XE TWSDLLookup.Destroy方法中的內存泄漏

描述了我的問題是所描述的變通,這僅僅是爲了增加FLookup.FreeTWSDLLookup.Destroy方法。
我不想更改Delphi源代碼,所以我嘗試將該單元複製到我的項目文件夾,進行更改並重新編譯,如湯姆的答案中所述here。這種技術的問題是,它顯然只有在你重新編譯所有依賴單元時纔有效。我試圖複製只是WSDLLookup.pas我的項目目錄,我得到一個Stackoverflow錯誤。我不熟悉Web服務/ SOAP,所以如果我使用這種技術,我不知道應該複製哪些其他單元。

Rob Kennedy在同一頁上的回答描述了一種涉及代碼掛鉤的不同技術 - 但它似乎不適用於對象方法。我按照他的建議完成了這些工作,並下載了TNT Unicode控制的免費代碼並找到了相關的程序,但我一直無法找到關於如何掛鉤對象方法的信息 - 如果這確實是可能的話。如果我可以這樣做,那麼我會鉤住TWSDLLookup.Destroy並添加FLookup.Free呼叫。

如何解決這個問題的任何想法將不勝感激。我是一個新手程序員,所以我希望我錯過了明顯的東西?

回答

3

你試圖做的事實上工作正常。我自己測試了一下。下面是我使用的項目文件:

program WSDLLookupTest; 

{$APPTYPE CONSOLE} 

uses 
    WSDLLookup in 'WSDLLookup.pas'; 

var 
    intf: IInterface; 

begin 
    intf := GetWSDLLookup as IInterface; 
end. 

我做了WSDLLookup.pas文件的副本,並將其放置在同一目錄下.dpr文件。然後,在複製而不是原件中,我修改了TWSDLLookup.Destroy

destructor TWSDLLookup.Destroy; 
begin 
    Beep; 
    ClearWSDLLookup; 
    FLookup.Free; 
    inherited; 
end; 

我加了Beep來證明自己這段代碼確實在執行。

在你的位置我肯定會使用這個解決方案,而不是嘗試代碼鉤子。當然,其他簡單的解決方案是升級到更高版本的Delphi版本。

需要注意的一件事是記住在升級時刪除修改過的單元。泄漏在XE2中被修復。

+0

感謝您的快速回復:) –

+0

我看到了一些可能使用調試dcus會導致問題 - 可能這就是爲什麼我的堆棧溢出。或者,也許我有另一個錯誤。 –

+0

無論如何,再次感謝。既然它確實有效,我會試着找出我在做什麼錯誤:) –