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

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

Ошибка при создании объекта [msxml2_tlb Create IXMLDOMDocument] [D7, XP]


vegarulez ©   (2016-01-18 01:33:00) 

Всем привет!
Мастера подскажите в чем тут подвох.
Использую msxml2_tlb.pas  - компилю приложение - все отлично - всё работает.
Запускаю эхзешник на другой машинке
и получаю ошибку при попытке создать объект и загрузить в него с помощью метода load - получаю ошибку:
-2147221163 Интерфейс не зарегистрирован

В инете проще искать по
(0x80040155): Интерфейс не зарегистрирован
или
(Исключение из HRESULT: 0x80040155)

хотя на своей машине повторюсь - все норм - всё работает. Полез в инет. Почитал - полез в реестр посомтреть зарегестрированные интерфейсы. А в частности интерфейс IXMLDOMDocumentпо адресу расположения интерфейса:
HKEY_CLASSES_ROOT\Interface\{2933BF81-7B36-11D2-B20E-00C04F983E60}
На моей машине присутствует, но и на той где не работает - тоже присутствует, один в один как и на моей. Т.е. дело было не в бабине...

Запускаю в маленькой тестовой программке - в основном потоке это же действие, на машине где не работало  -  всё работает. Не пойму в чем может быть дело - т.е. когда в основном потоке то нет ошибки - что якобы интерфейс не присутсутвует - всё успешно отрабатывает, а когда в дополнительный поток скинул - то ошибка... (

Не могу понять, что делаю не так. Подскажите, где я ошибся?

private
   s_err: string;// переменная для записи логов

...

procedure TWeather.Execute;
var
 objXMLDoc: IXMLDOMDocument;
 s_w: Ansistring;
 Path, ID, title, producer: string;
 I, k: Integer;
// k - метка чтобы понять в случае чего где ошибка
// FixError - процедура синхронизации с основным потоком и записью в файл лога
begin
 try
   try
     s_err := '[TWeather.Execute]:+-+-+-+ Start +-+-+-+';
     Synchronize(FixError); // логирование
     k := 0;
     CoInitializeEx(nil, COINIT_MULTITHREADED);
     k := 1;
     PathExe := ExtractFileDir(Application.ExeName);
     k := 2;
     ListTranslate := TStringList.Create;
     k := 3;
     IniFile := TIniFile.Create(PathExe + '\some.ini');
     k := 4;
     Area := IniFile.ReadString('some', 'data', 'somedata');
     k := 5;
     ListTranslate.Clear;
     k := 6;
     IniFile.ReadSectionValues('Translate', ListTranslate);
     k := 7;
     objXMLDoc := CreateOLEObject('Microsoft.XMLDOM') as IXMLDOMDocument;
     objXMLDoc.async := False;
     k := 8;
     s_w := ' http://someurl.com';
     objXMLDoc.load(s_w);

     s_err := '[TWeather.Execute]:' + s_w;
     Synchronize(FixError);

     if objXMLDoc.parseError.errorCode <> 0 then // тут проверяем есть ли ошибка, о которой собственно сабж
     begin
       s_err := '[TWeather.Execute]objXMLDoc:' + inttostr(objXMLDoc.parseError.errorCode) +' '+ objXMLDoc.parseError.reason + ' ' + objXMLDoc.parseError.srcText; // описание и код ошибки
       Synchronize(FixError); // логирование
     end;

     k := 9;
     Node := objXMLDoc.DocumentElement;
     k := 10;
     if (Node <> nil) then
     begin
       s_err := Node.xml;
       Synchronize(FixError);// логирование
       Synchronize(UpdateCaption);
     end;

   finally
     s_err := '[TWeather.Execute]:+-+-+-+ End +-+-+-+';
     Synchronize(FixError);
     ListTranslate.Free;
     IniFile.Free;
     objXMLDoc := nil;
     CoUninitialize;
     Terminate;
   end;
 except on E: Exception do
   begin //9
     s_err := 'ERROR[TWeather.UpdateCaption]:' + E.Message + ':' + inttostr(E.HelpContext) + ' metka:' + inttostr(k);
     Synchronize(FixError);// логирование
   end; //9
 end; //8
end;


кгшзх   (2016-01-21 09:00:00) [1]

if objXMLDoc.parseError.errorCode <> 0 then // тут проверяем есть ли ошибка, о которой собственно сабж

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


кгшзх   (2016-01-21 08:53:00) [2]

переделай на асинхронный IXMLHTTPRequest, тогда надобность во вторичном потоке отпадет.
все что потребуется дополнительно - написать наследника от idispatch у которого по dispid = 0 будет вызываться метод обрабатывающий onReadyStateChange.


vegarulez   (2016-01-21 01:54:00) [3]

судя по всему проблема где в другом месте, т.е. или в главном потоке, или ещё где-то. Ибо пересобрал с нуля чистый проект, не включал туда все функции главного потока и не подключал все файлы из юзес - всё работает, на той машине где сыпала ошибку.

Разбираюсь дальше.


vegarulez   (2016-01-20 23:18:00) [4]

>sniknik ©   (18.01.16 11:03) [5]
В том то и прикол что у меня на машинке - всё нормально работает - и на других раньше нормально работало. ничего не поменялось. но почему -то перестало работать. на некоторых до сих пор работает, но не на всех.
Поэтому версии то по сути одинаковые должны быть. Во всяком случае ссылки в реестре проверил на интерфейсы - теже.
Да и когда запускаю отдельно программку, где всё это реализовано в главном потоке  - то всё нормально же отрабатывает, без сучка без задоринки. Специально ее запускал на тех машинах, где не нормально отрабатывает в дополнительном потоке.

Попробовал с CoDomDocument

вприниципе всё чтот тут описано
http://compress.ru/article.aspx?id=12504
на моей тачке отлично отрабатывает - без сучка, без задоринки.
тоже самое делаю на машине где ошибка - вываливает ошибку:

objXMLDoc:-2147221163 Интерфейс не зарегистрирован

уже всю голову себе сломал (


han_malign   (2016-01-19 14:56:00) [5]

И работу с интерфейсами надо бы еще в одну процедуру завернуть, а то там лишние неявные интерфейсные ссылкибывают - кторые начинают убиваться после CoUninitialize...


кгшзх   (2016-01-18 11:45:00) [6]

CreateOLEObject(' MSXML2.DOMDocument')

И убрать тлб.
Переделать ссылки на документ переделать

IXMLDOMDocument => OleVariant

Либо убрать CreateOLEObject и использовать CoDomDocumentXXX.Create
Ссылки оставить нативных типов

А то все же наперекосяк.


sniknik   (2016-01-18 11:03:00) [7]

> но и на той где не работает - тоже присутствует
а версии совпадают? и где гарантии, что все подчиненные интерфейсы установлены?
попробуй не свой, импортированный модуль, а из стандартных в дельфе -

uses XMLDoc, XMLIntf;

var
 XMLDoc: IXMLDocument;
begin
 ...
 XMLDoc := LoadXMLData(XMLText);
 ...


и версия должна быть, и ошибки должны стать понятнее.


кгшзх   (2016-01-18 10:47:00) [8]

плюс зачем тебе вообще тлб, если связываение позднее?

  objXMLDoc := CreateOLEObject('Microsoft.XMLDOM') as IXMLDOMDocument;


кгшзх   (2016-01-18 10:46:00) [9]

сравни разрядность обеих систем.
посмотри какая именно версия импортировалась при создании tlb
если шестая, попробуй четвертую, на "той" машине возможно ее просто нет


vegarulez   (2016-01-18 01:49:00) [10]

uses
 windows, SysUtils, Types, Classes, Controls, Forms, IniFiles, Activex,
 ComObj, MSXML2_TLB;


vegarulez   (2016-01-18 01:35:00) [11]

Забыл написать что привел код дополнительного потока TThread.Execute


Наверх

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