2013-08-03 19 views
5

私はTXMLDocumentを使用して、Webサーバーで使用されるXML文字列を書き込みます。このコンポーネントは、サーバーが要求を受け取ったときに作成され、XMLを生成し、それをクライアントに戻し、コンポーネントはfreeです。しかし、このコンポーネントがフリーである場合、私は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を取得したことは確かですが、何らかの理由で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

関連する問題