Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2017.12.24;
Скачать: CL | DM;

Вниз

Ошибка при создании объекта   Найти похожие ветки [msxml2_tlb Create IXMLDOMDocument]

 
vegarulez   (2016-01-18 01:33) [0]

Всем привет!
Мастера подскажите в чем тут подвох.
Использую 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;


 
vegarulez   (2016-01-18 01:35) [1]

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


 
vegarulez   (2016-01-18 01:49) [2]

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


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

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


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

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

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


 
sniknik ©   (2016-01-18 11:03) [5]

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

uses XMLDoc, XMLIntf;

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


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


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

CreateOLEObject("MSXML2.DOMDocument")

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

IXMLDOMDocument => OleVariant

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

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


 
han_malign ©   (2016-01-19 14:56) [7]

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


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

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

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

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

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

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


 
vegarulez   (2016-01-21 01:54) [9]

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

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


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

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


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

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

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



Страницы: 1 вся ветка

Текущий архив: 2017.12.24;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.004 c
15-1467989201
Kilkennycat
2016-07-08 17:46
2017.12.24
Что лучше, C# или Delphi


2-1453717107
Andrey K
2016-01-25 13:18
2017.12.24
Как активировать устройство подсоеденёное через роутер.


2-1452769577
testeruser
2016-01-14 14:06
2017.12.24
Thread


2-1452253920
gedevan
2016-01-08 14:52
2017.12.24
Как сделать sql запрос к нескольким таблицам (ADO,MS Access)?


2-1453069996
vegarulez
2016-01-18 01:33
2017.12.24
Ошибка при создании объекта