2013-08-03 50 views
5

Tôi đang sử dụng TXMLDocument để viết một chuỗi XML được sử dụng trong máy chủ web. Thành phần được tạo ra khi máy chủ nhận được yêu cầu, tạo ra XML, chuyển nó trở lại cho máy khách, sau đó thành phần đó là free'd. Tuy nhiên, khi thành phần này là miễn phí, tôi nhận được Invalid pointer operation.TXMLTài liệu 'Thao tác con trỏ không hợp lệ' khi giải phóng

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; 

Tại sao tôi nhận được điều này và làm thế nào để loại bỏ nó?

Thật kỳ lạ, mặc dù tôi có thể xác nhận rằng Response.ContentText thực tế nhận được XML, vì lý do nào đó máy chủ web không trả lại dữ liệu này cho khách hàng sau ngoại lệ này - nhưng tôi cho rằng đó là nguyên nhân/vấn đề khác .

PS - CoInitialize(nil)CoUninitialize được gọi xung quanh trình xử lý này vì máy chủ web đa luồng và TXMLDocument là COM.

Trả lời

9

Nó ghi trong constructor's tham khảo:

thành phần TXMLDocument được tạo ra trong thời gian chạy mà không có một chủ sở hữu được giải phóng tự động khi tất cả các tham chiếu đến giao diện IXMLDocument của họ được phát hành.

Vì bạn đã chỉ định số Owner trong số TXMLDocument gọi hàm tạo của mình, bạn không nên tự mình phát hành.

+1

Chà, tôi chưa bao giờ mong đợi điều đó xảy ra. Cảm ơn bạn đã chỉ ra điều đó. –

+0

Hoặc, bạn nên sử dụng hàm Delphi có cho mục đích đó: 'iDoc: = NewXMLDocument;' trong đó 'iDoc' là biến của kiểu' IXMLDocument'. – pf1957

+0

Bạn được chào đón. Dù sao, thay vào đó, bạn có thể khai báo biến 'XML' của bạn thành' IXMLDocument' và tạo một tài liệu mới gọi ['NewXMLDocument'] (http://docwiki.embarcadero.com/Libraries/XE2/en/Xml.XMLDoc. NewXMLDocument). – TLama