Форум: "Начинающим";
Текущий архив: 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