2013-08-03 37 views
5

我使用TXMLDocument來編寫在Web服務器中使用的XML字符串。當服務器接收到請求,產生XML,將它傳遞迴客戶端,然後組件被釋放時,該組件被創建。但是,當這個組件是免費的,我得到Invalid pointer operationTXMLDocument'無效的指針操作'釋放時

XML:= TXMLDocument.Create(nil); 
    try 
    XML.Active:= True; 
    nRoot:= XML.AddChild('topics'); 
    for X := 0 to FCHM.Topics.Count - 1 do begin 
     nTopic:= nRoot.AddChild('topic'); 
     //Add more data... 

    end; 
    Response.ContentText:= XML.XML.Text; 
    Response.ContentType:= 'text/xml'; 
    XML.Active:= False; 
    finally 
    XML.Free; //<-- Invalid pointer operation 
    end; 

爲什麼我得到這個,如何擺脫它?

奇怪的是,雖然我可以確認Response.ContentText確實獲得了XML,但出於某種原因,Web服務器無法在發生此異常後將此數據返回給客戶端 - 但我認爲這是一個不同的因果問題。

PS - CoInitialize(nil)CoUninitialize是圍繞此處理程序調用的,因爲Web服務器是多線程的,而TXMLDocument是COM。

回答

9

它在constructor's參考指出:當他們IXMLDocument 接口的所有引用被釋放被自動地釋放在運行時創建無主

TXMLDocument的組件。

既然你已經在你的TXMLDocument構造函數調用沒有指定Owner,你不應該自己釋放。

+1

哇,我從來沒有料到會是這樣。感謝您指出了這一點。 –

+0

或者,您應該使用Delphi爲此目的的函數:'iDoc:= NewXMLDocument;'其中'iDoc'是IXMLDocument類型的變量。 – pf1957

+0

不客氣。無論如何,作爲替代方案,您可以將'XML'變量聲明爲'IXMLDocument',並創建一個新的文檔調用['NewXMLDocument'](http://docwiki.embarcadero.com/Libraries/XE2/en/Xml.XMLDoc。 NewXMLDocument)函數。 – TLama