스레드나 소킷에서 도큐먼트(DOM)를 엑세스하기전에는 반드시 Coinitalize를
먼저 선언해야만 한다고 합니다..
msxml.pas에 버그가 있는것 같은데 근본적인 이유는 사실 MS-XML 자체도 COM 컴포넌트이기
때문에 그런것 같다고 합니다.
방법은 아래와 습니다.
Coinitialize(nil);
작업...
CoUninitialize;
의 순으로 작업을 해 주어야 한다.
uses ActivX;
{생략}
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
RcvTxt: string;
Node: IXMLNode;
temp: string;
begin
RcvTxt := AThread.Connection.ReadLn;
try
Coinitialize(nil);
^^^^^^^^^^^^^^^^^^^
XMLDocument := TXMLDocument.Create(Form1);
XMLDocument.XML.Clear;
XMLDocument.XML.Add(RcvTxt);
Memo1.Lines.AddStrings(XMLDocument1.XML);
try
XMLDocument.Active := True;
Node := XMLDocument.DocumentElement.ChildNodes.FindNode('service');
temp := Node.Attributes['type'];
Memo1.Lines.Add(temp);
except
Memo1.Lines.Add('error');
end;
finally
XMLDocument.Active := False;
XMLDocument.Free;
CoUninitialize;
^^^^^^^^^^^^^^^^
end;
Memo1.Lines.Add('complete2');
end;
|