![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Написал такую функцию.Но результат - Ошибка 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
|
|||
|
|||
![]() И в чем проблема?
Код:
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; Если тебе нужен именно 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 (Вчера)
|
#3
|
|||
|
|||
![]() А как передать
XmlObj.DomVendor:= GetDOMVendor('OPEN XML') ? Дело в том,что в com DLL которую я делаю выдается ошибка! |
#4
|
|||
|
|||
![]() Тут 2 проблемы.
1. DOMVendor есть только у TXMLDocument, у IXMLDocument его нет. Соответственно, надо сначала создать TXMLDocument, установить у него свойство, потом получить из него IXMLDocument и уже дальше работать с ним. 2. Ошибка может возникать т.к. такого вендора может не быть. Вот тут есть список стандартных вендоров: https://docwiki.embarcadero.com/RADS...t_Object_Model Так же можно посмотреть какие вендоры зарегистрированны в этой переменной: https://docwiki.embarcadero.com/Libr...dom.DOMVendors Ну и там есть ссылка на документацию на RegisterDOMVendor - если тебе надо зарегистрировать какогото своего вендора. |