2013-08-03 2 views
5

Я использую TXMLDocument для записи XML-строки, которая используется на веб-сервере. Компонент создается, когда сервер получает запрос, создает XML, передает его обратно клиенту, затем компонент свободен. Однако, когда этот компонент свободен, я получаю Invalid pointer operation.TXMLDocument «Недопустимая операция указателя» при освобождении

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, по какой-то причине веб-сервер не смог вернуть эти данные клиенту после этого исключения, но я предполагаю, что это другая причина/проблема ,

PS-CoInitialize(nil) и CoUninitialize вызываются вокруг этого обработчика, так как веб-сервер многопоточен, а TXMLDocument - COM.

ответ

9

Об этом говорится в constructor's ссылке:

TXMLDocument компоненты, которые создаются во время выполнения без владельца освобождаются автоматически, когда все ссылки на их интерфейс IXMLDocument высвобождаются.

Поскольку вы не указали не Owner в вашем TXMLDocument вызова конструктора, вы не должны освободить его самостоятельно.

+1

Ничего себе, я бы никогда не ожидал, что так будет. Спасибо что подметил это. –

+0

Или вы должны использовать функцию Delphi для этой цели: 'iDoc: = NewXMLDocument;' где 'iDoc' является переменной типа' IXMLDocument'. – pf1957

+0

Добро пожаловать. В любом случае, в качестве альтернативы вы можете объявить свою переменную 'XML' как« IXMLDocument »и создать новый вызов документа [' NewXMLDocument'] (http://docwiki.embarcadero.com/Libraries/XE2/en/Xml.XMLDoc. NewXMLDocument). – TLama

Смежные вопросы