Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 24.05.2023, 12:37
infopol infopol вне форума
Прохожий
 
Регистрация: 03.06.2021
Сообщения: 35
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Нужно создать ComObject из TXMLDocument. Как это сделать?

Написал такую функцию.Но результат - Ошибка Com Class не зарегистрирован.Что я делаю не так?
Код:
  function XmlObjCreate(const files:string):OleVariant ;
var
  XmlObj:TXMLDocument;
   aStr:TStringStream;
   begin

     XmlObj:= TXMLDocument.Create(files);
  try
  if FileExists(files) then
  begin


   XmlObj.FileName:=files ;
   XmlObj.LoadFromFile(files);
   end
   else

   begin
    aStr:=TStringStream.Create(files);
   XmlObj.LoadFromStream(aStr);//,xetUTF_8);
    try XmlObj.XML.Text:=files;  except
    end;
    aStr.Free;

     Result:=XmlObj.ComObject;
     end;
   finally
     XmlObj.Active:=True;

 Result:=  XmlObj.ComObject;

    end;
   end;
Ответить с цитированием
  #2  
Старый 28.05.2023, 06:37
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

И в чем проблема?
Код:
procedure TForm1.Button1Click(Sender: TObject);
const
  sXml = '<xml><items><item><id>1</id></item><item><id>2</id></item></items></xml>';
var
  xmlDoc : IXMLDocument;
  strXml : String;
begin
  xmlDoc := TXMLDocument.Create(Nil);
  Try
    xmlDoc.LoadFromXML(sXml);
    xmlDoc.Active := True;
    xmlDoc.ChildNodes.Nodes[0].AddChild('item').AddChild('id').Text := '3';
    xmlDoc.SaveToXML(strXml);
    strXml := StringReplace(strXml,'</item>','</item>'#13#10,[rfReplaceAll]); //  Это просто для удобства просмотра
    ShowMessage(strXml);
  Finally
  End;
end;
т.е. у тебя в xmlDoc уже ссылка на интерфейс сразу после создания объекта.

Если тебе нужен именно IUnknown, то попроси его у IXMLDocument:
Код:
var
  intfUnkn : IUnknown;
begin
  ...
  intfUnkn := xmlDoc as IUnknown;
  ...

ЗЫ. Кстати, такой объект удалять не надо, он сам самоудалится как только выйдет из области видимости - это ж Com объект.

ЗЗЫ. Кстати, IXMLDocument, походу, не является OLE Automation интерфейсом, так что "засунуть" его в OleVariant не получится.
Если надо возвращать какой-то общий тип, то возвращай IUnknown:
Код:
function GetXML(Str : String) : IUnknown;
var
  xmlDoc : IXMLDocument;
begin
  xmlDoc := TXMLDocument.Create(Nil);
  xmlDoc.LoadFromXML(str);
  xmlDoc.Active := True;
  Result := xmlDoc as IUnknown;
end;

procedure TForm1.Button2Click(Sender: TObject);
const
  sXml = '<xml><items><item><id>1</id></item><item><id>2</id></item></items></xml>';
var
  xmlDoc : IXMLDocument;
  strXml : String;
begin
  xmlDoc := GetXML(sXml) as IXMLDocument;
  xmlDoc.ChildNodes.Nodes[0].AddChild('item').AddChild('id').Text := '3';
  xmlDoc.SaveToXML(strXml);
  strXml := StringReplace(strXml,'</item>','</item>'#13#10,[rfReplaceAll]); //  Это просто для удобства просмотра
  ShowMessage(strXml);
end;

Последний раз редактировалось lmikle, 28.05.2023 в 07:09.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
infopol (06.06.2023)
  #3  
Старый 06.06.2023, 08:09
infopol infopol вне форума
Прохожий
 
Регистрация: 03.06.2021
Сообщения: 35
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

А как передать
XmlObj.DomVendor:= GetDOMVendor('OPEN XML') ?
Дело в том,что в com DLL которую я делаю выдается ошибка!
Ответить с цитированием
  #4  
Старый 06.06.2023, 19:33
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Тут 2 проблемы.
1. DOMVendor есть только у TXMLDocument, у IXMLDocument его нет. Соответственно, надо сначала создать TXMLDocument, установить у него свойство, потом получить из него IXMLDocument и уже дальше работать с ним.
2. Ошибка может возникать т.к. такого вендора может не быть. Вот тут есть список стандартных вендоров:
https://docwiki.embarcadero.com/RADS...t_Object_Model
Так же можно посмотреть какие вендоры зарегистрированны в этой переменной:
https://docwiki.embarcadero.com/Libr...dom.DOMVendors
Ну и там есть ссылка на документацию на RegisterDOMVendor - если тебе надо зарегистрировать какогото своего вендора.
Ответить с цитированием
  #5  
Старый 26.06.2023, 14:23
infopol infopol вне форума
Прохожий
 
Регистрация: 03.06.2021
Сообщения: 35
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Incompatible type IUnknown and TXMLDocument

Код:
function GetXML(Str : String) : IUnknown;
var
  xmlDoc : TXMLDocument;
begin
  xmlDoc := TXMLDocument.Create(nil);
//if FileExists(str)  then
//begin

  xmlDoc.LoadFromXML(str);
  xmlDoc.Active := True;


 Result :=  xmlDoc as IUnknown;

 // end;

  end;
Ответить с цитированием
  #6  
Старый 26.06.2023, 17:39
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Поменяй тип переменной на IXMLDocument
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:24.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter