Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > TIdTCPServer и TXMLDocument


Автор: SteelRat 22.10.2004, 10:19
При соединении с серверов в методе OnExecute пытаюсь создать динамический объект типа TXMLDocument. При его создании вызывается exception с сообщением Microsoft MSXML is not installed, хотя тот же самый код при нажатии на какую-нибудь кнопку работает идеально. Может кто-то с этим сталкивался и сумеет мне помочь. Заранее благодарен.

Автор: _hunter 22.10.2004, 10:33
неплохо бы код показать ( оба варианта )

Автор: SteelRat 24.10.2004, 21:47
1-й вариант:
Кидаю на форму компонент TXMLDocument и в методе OnExecute компонента TIdTCPServer пытаюсь загрузить XML файл:
XMLDoc.LoadFromFile("c:\File.xml");
2-й вариант:
В методе OnExecute компоненты TIdTCPServer пишу слудующее
var
XMLDoc: IXMLDocument;
begin
inherited;
XMLDoc := NewXMLDocument;
XMLDoc.LoadFromFile('c:\File.xml');
....
end;



Автор: pethead 15.9.2009, 07:41
я так понял что MSXML в потоке не умеет работать, а метод OnExecute вызывается в потоке порожденным компонентом.

вот и объяснение.

> The problem I get is I cannot activate teh XML Component, I get
> an error stating that the COInitialize has not been called.

The error is self-explanatory.  You have not called CoInitialize/Ex() yet
before trying to instantiate the parser.  The parser you are using is
internally trying to use an ActiveX object (if you are using TXMLDocument,
then on Windows machines it uses MSXML by default, which is ActiveX-based).
Any thread that wants to use an ActiveX object must call CoInitialize/Ex()
first.  TIdTCPServer is a multi-threaded component.

> Research show I need to pu in the Coinitilize statement in the code
> but i have no idea where nor how to.

You can call it in the server's OnConnect event, and then call
CoUninitialize() in the OnDisconnect event.

A better way to do it would be to derive a new class from TIdThreadWithTask
and override its BeforeExecute() and AfterExecute() to make the calls
instead.  Then assign one of the TIdSchedulerOfThread descendants (such as
TIdSchedulerOfThreadDefault) to the server's Scheduler property, and assign
your custom class type to the scheduler's ThreadClass property. 

я заменил TXMLDocument на 
 SimpleXML - Библиотека для синтаксического разбора текстов XML
     и преобразования в иерархию XML-объектов.
     И наоборот: можно сформировать иерархию XML-объектов, и
     уже из нее получить текст XML.
     Достойная замена для MSXML. При использовании Ansi-строк
     работает быстрее и кушает меньше памяти.



Автор: Romikgy 15.9.2009, 09:40
Цитата(SteelRat @  24.10.2004,  20:47 Найти цитируемый пост)
inherited;

зачем это в onExecute ?
и вместо 
XMLDoc: IXMLDocument;
может заюзать TXMLDocument 
ведь первый это только интерфейс,
насколько я понимаю это только описание ф-ций ,  а к какому объекту обращатся он как бы не знает .... (в этой строке могу быть не прав)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)