Форум по 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,056
Версия 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,056
Версия 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,056
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Поменяй тип переменной на IXMLDocument
Ответить с цитированием
  #7  
Старый 27.06.2023, 09:26
infopol infopol вне форума
Прохожий
 
Регистрация: 03.06.2021
Сообщения: 35
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Выдает ошибку несоответствия типов IXMLDocument и TXMLDocument

Не помогло
Ответить с цитированием
  #8  
Старый 27.06.2023, 12:10
infopol infopol вне форума
Прохожий
 
Регистрация: 03.06.2021
Сообщения: 35
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Сделал так

Код:
function GetXML(Str : String) : IUnknown;
var
  xmlDoc : TXMLDocument;
begin
  xmlDoc := TXMLDocument.Create(Nil);
if FileExists(str)  then
xmlDoc.LoadFromFile(str) else
  xmlDoc.LoadFromXML(str);
  try
  xmlDoc.Active := True;
  Result := xmlDoc as IUnknown;
     except
         Result:=nil;
     end;


  end;

Делаю COM DLL ,в ней функция
Код:
uses ComServ;
function TIP2COM.F_IXML_OBJECT(const aPar: WideString): IUnknown; safecall;
 begin
   try
   Result:=GetXML(aPar);
   except
       ShowMessage('Ошибка создания объекта!');
       end;
 end;
При вызове

ip2:=CreateOleObject('Ip2Com_events.Ip2Com');
oxml:=ip2.F_IXML_OBJECT(ExtractFilePath(ParamStr(0 )) + '/health.xml') ;

выдается ошибка на сервере.
Возможно ли использовать этот объект в COM DLL?

Последний раз редактировалось infopol, 29.06.2023 в 09:19.
Ответить с цитированием
  #9  
Старый 30.06.2023, 07:44
infopol infopol вне форума
Прохожий
 
Регистрация: 03.06.2021
Сообщения: 35
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию В COM DLL - Ошибка на сервере

при вызове

Код:
 function GetXML(Str : String) : IUnknown;
var
  xmlDoc : iXMLDocument;
begin

    try
   xmlDoc:= CreateXmlDocument;
  if FileExists(str)  then
xmlDoc.Load(str)
else
  xmlDoc.LoadXML(str);

  Result := xmlDoc as IUnknown;
     except
         Result:=nil;
     end;
end;
В этом фрагменте вылетает ошибка.
Код:
procedure TTestForm.Button1Click(Sender: TObject);
var
  oxml:IUnknown;
  ip2:OleVariant;
	aDoc: IXmlDocument;
	anElem2: IXmlNode;
begin
 ip2:=CreateOleObject('Ip2Com_events.Ip2Com');
oxml:=ip2.F_IXML_OBJECT(ExtractFilePath(ParamStr(0)) + 'health.xml')  ;

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

Какая ошибка, на какой строке?
И вообще, нафига такие сложности для чтения xml?
Ответить с цитированием
  #11  
Старый 30.06.2023, 13:15
infopol infopol вне форума
Прохожий
 
Регистрация: 03.06.2021
Сообщения: 35
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию в oxml:=ip2.F_IXML_OBJECT(ExtractFilePath(ParamStr(0 )) + 'health.xml') ;

пишет Ошибка сервера.
А сложности,для использования объекта OXML в бухпрограмме "Инфо-Предприятие". Кое-что хочу сделать в обход MSXML

Последний раз редактировалось infopol, 30.06.2023 в 13:17.
Ответить с цитированием
  #12  
Старый 01.07.2023, 00:36
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,056
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А у тебя твой объкт точно реализует OLE интерфейс?
И зачем тебе OLE? Из приведенного кода этого не видно.
Попробуй просто импортировать в тестовое приложение твой компонент и создать его через CoClass.
Ответить с цитированием
  #13  
Старый 03.07.2023, 07:25
infopol infopol вне форума
Прохожий
 
Регистрация: 03.06.2021
Сообщения: 35
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Мне нужно получить com объект в стороннем приложении

Вот часть кода COMDLL
Код:
type
  TIp2Com = class(TAutoObject, IIp2Com)
 
  protected
function F_IXML_OBJECT(const aPar: WideString): IUnknown; safecall;
end;
 function GetXML(Str : String) : IUnknown;
 
 implementation
 
 
 
uses ComServ;
function TIP2COM.F_IXML_OBJECT(const aPar: WideString): IUnknown; safecall;
 begin
   try
   Result:=GetXML(aPar);
   except
     try
     Result:=iXmlObjCreate(aPar) ;
     except
       ShowMessage('Îøèáêà ñîçäàíèÿ îáúåêòà');
       end;
       end;
 end;
function GetXML(Str : String) : IUnknown;
var
  xmlDoc : TXMLDocument;
begin
  xmlDoc := TXMLDocument.Create(Nil);
if FileExists(str)  then
xmlDoc.LoadFromFile(str) else
  xmlDoc.LoadFromXML(str);
  try
  xmlDoc.Active := True;
  Result := xmlDoc as IUnknown;
     except
         Result:=nil;
     end;
 
 
  end;
Ответить с цитированием
  #14  
Старый 04.07.2023, 11:22
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,056
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А библиотеку типа покажи тоже.
Ответить с цитированием
  #15  
Старый 05.07.2023, 16:49
infopol infopol вне форума
Прохожий
 
Регистрация: 03.06.2021
Сообщения: 35
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Пробуй

Не работает.
Вложения
Тип файла: zip Ip2Com_events.zip (940.8 Кбайт, 1 просмотров)
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter