![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка при создании объекта [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