![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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 (06.06.2023)
| ||
|
#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 - если тебе надо зарегистрировать какогото своего вендора. |
|
#5
|
|||
|
|||
|
Код:
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
|
|||
|
|||
|
Поменяй тип переменной на IXMLDocument
|
|
#7
|
|||
|
|||
|
Не помогло
|
|
#8
|
|||
|
|||
|
Код:
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
|
|||
|
|||
|
при вызове
Код:
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
|
|||
|
|||
|
Какая ошибка, на какой строке?
И вообще, нафига такие сложности для чтения xml? |
|
#11
|
|||
|
|||
|
пишет Ошибка сервера.
А сложности,для использования объекта OXML в бухпрограмме "Инфо-Предприятие". Кое-что хочу сделать в обход MSXML Последний раз редактировалось infopol, 30.06.2023 в 13:17. |
|
#12
|
|||
|
|||
|
А у тебя твой объкт точно реализует OLE интерфейс?
И зачем тебе OLE? Из приведенного кода этого не видно. Попробуй просто импортировать в тестовое приложение твой компонент и создать его через CoClass. |
|
#13
|
|||
|
|||
|
Вот часть кода 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
|
|||
|
|||
|
А библиотеку типа покажи тоже.
|
|
#15
|
|||
|
|||
|
Не работает.
|