私は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であるため、このハンドラーの周りに呼び出されます。
うわー、私はそれが当てはまるとは思わなかったでしょう。それを指摘してくれてありがとう。 –
または、その目的のためにDelphiが持っている関数を使うべきです: 'iDoc:= NewXMLDocument;' 'iDoc'は' IXMLDocument'型の変数です。 – pf1957
ようこそ。とにかく、代わりにあなたの 'XML'変数を' IXMLDocument'と宣言し、新しい文書呼び出し['NewXMLDocument'](http://docwiki.embarcadero.com/Libraries/XE2/en/Xml.XMLDoc)を作成することができます。 NewXMLDocument)関数を使用します。 – TLama