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