Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2017.12.24;
Скачать: [xml.tar.bz2];

Вниз

Ошибка при создании объекта   Найти похожие ветки [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;
Скачать: [xml.tar.bz2];

Наверх





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


2-1453318580
testeruser
2016-01-20 22:36
2017.12.24
структура базы


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


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


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский