Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TXMLDocument и ошибка Microsoft MSXML is not installed


Akella-M ©   (2013-04-18 13:04:00) 

В потоке обращаюсь через Syncrhonize к компоненту на форме - ошибка.
Создаю компонент в потоке - тоже ошибка.

constructor TSellerReceive.Create(Name: string);
begin

 CoInitialize(nil);
 inherited Create(True);
 FreeOnTerminate := True;
 GMS:=tmemorystream.Create;
 GCQ:=TSQLQuery.Create(nil);
 GXML:=txmldocument.Create(nil);

...

procedure TSellerReceive.Execute;
var
  ReceivedXMLText:TStringList;
begin

  ...
 
  GXML.XML.Text:=ReceivedXMLText.text;
  GXML.Active:=true;

  ...

тут выдает Exeption ту самую ошибку

Delphi XE3, Win7x64


Ega23   (2013-04-18 21:13:00) [1]


> Кто будет гуглить эту тему - возможно Вам поможет инфа,
> что в потоке TXMLDocument.Create нельзя указывать с nil,
>  укажите хотябы application:
>
> TXMLDocument.Create(Application);
>
> Иначе будет Invalit Pointer Operation


var
 xml: IXMLDocument
begin
 xml := TXMLDocument.Create(nil);
end;

var
 xml: TXMLDocument;
begin
 xml := TXMLDocument.Create(SomeOwner);
 try

 finally
   xml.Free  
 end;
end;


Почувствуй разницу. В первом случае ты работаешь с ним, как с интерфейсом, при refCount=0 деструктор вызовется автоматически.
Во втором случае - как с невизуальным компонентом, который можно на форму или в дата-модуль кинуть.
Ты, скорее всего, объявил его именно как TXMLDocument, вызвал деструктор, а потом деструктор вызвался автоматом повторно при удалении ссылки, о чём исключение IPO и говорит.

От потока не зависит, в главном будет то же самое.


Медвежонок Пятачок   (2013-04-18 20:29:00) [2]

что в потоке TXMLDocument.Create нельзя указывать с nil,

Можно.
Хоть в потоке хоть как. Просто надо хелп читать.


Akella-M   (2013-04-18 20:20:00) [3]

Помогло, спасибо.

Кто будет гуглить эту тему - возможно Вам поможет инфа, что в потоке TXMLDocument.Create нельзя указывать с nil, укажите хотябы application:

TXMLDocument.Create(Application);

Иначе будет Invalit Pointer Operation


Ega23   (2013-04-18 16:57:00) [4]

CoInitialize, CoUninitialize, TXMLDocument.Create(nil) и XML := nil вынести в Execute.


Akella-M   (2013-04-18 16:17:00) [5]

Не очень понял, но реализовал аналогичную идея используя IXMLDocument2

Правда 4 потока выдают производительность HTTP метод POST + SQLQuery запрос Insert за три секунды.

Не пойму почему так долго, средняя скорость аналогичной операции без IXMLDocument2 занимала 1 секунду на 120 записей.

Может тормозить изза IXMLDocument2?


Медвежонок Пятачок   (2013-04-18 14:08:00) [6]

все стереть и переписать.
экземпляр создается в одном потоке, коуинит делается в том же, а используется все это в другом потоке.


Наверх

Титульная страница Поиск, карта сайта Написать письмо