Здравствуйте, Sinclair, Вы писали:
PZ>>Пытаюсь создать экземпляр класса TXMLDocument:
PZ>>TXMLDocument *X = new TXMLDocument("test.xml");
PZ>>И при первом обращении к X->DocumentElement получаю AV: read of mem...
PZ>>Причем, если создать экземпляр в Designtime, все ОК.
PZ>>Что я делаю неправильно?
S>Судя по документации, основное различие этих объектов, созданных в дизайне и в рантайме (точнее, созданных при помощи разных версий конструктора), состоит в их времени жизни.
S>Созданные в дизайне инстансы TXMLDocument убиваются их Owner'ом. Т.е. они живы, пока жива форма-их хозяин.
S>Те же, которые созданы указанным вами способом, живут до тех пор, пока есть ссылки на их интерфейс IXMLDocument.
S>Скорее всего, в этом и есть корень всех зол — где-то между моментом создания объекта и обращением к его DocumentElement происходит внезапная смерть. Рекомендую попробовать сделать X указателем на IXMLDocument вместо указателя на TXMLDocument.
Подобная проблема с TXMLDocument в CB6, уже перепробовал все что мог:
qpacket.h
class QPacket
{
protected:
AnsiString xml;
public:
QPacket(void);
QPacket(char * xml);
~QPacket(viod);
void SetCommand(char * cmd);
AnsiString GetSendString(void);
}
qpacket.cpp
QPacket::QPacket(void)
{
TXMLDocument * Data;
_di_IXMLNode root, node;
Data=new TXMLDocument(WideString(""));
Data->DOMVendor=GetDOMVendor(AnsiString("Open XML"));
Data->Active=true;
root=Data->AddChild(WideString("datapacket"));
node=root->AddChild(WideString("session"));
node=root->AddChild(WideString("command"));
node=root->AddChild(WideString("params"));
Data->SaveToXML(this->xml);
// delete Data; //Здесь затыкаемся если убрать коментарии, почему не ясно, вроде как просто пытаемся удалить объект...
return;
}
QPacket::QPacket(char * x)
{
TXMLDocument * Data;
Data=new TXMLDocument(WideString(""));
Data->DOMVendor=GetDOMVendor(AnsiString("Open XML"));
Data->Active=true;
Data->XML->Text=x;
Data->SaveToXML(this->xml);
// delete Data // то же самое...
return;
}
QPacket::~QPacket(void)
{
this->xml="";
return;
}
void QPacket::SetCommand(char * cmd)
{
_di_IXMLNode root, node;
TXMLDocument * Data;
Data=new TXMLDocument(WideString(""));
Data->DOMVendor=GetDOMVendor(AnsiString("Open XML"));
Data->Active=true;
Data->LoadFromXML(this->xml);
root=Data->DocumentElement->ChildNodes->GetNode(0); // А вот тут вообще отпад, здесь и стоим, просто вылетаем с AV, хотя вроде как обект создан и Актив, XML в него загрузился без проблем...
node=root->ChildNodes->GetNode(WideString("command"));
node->Text=WideString(cmd);
Data->SaveToXML(this->xml);
return;
}
AnsiString QPacket::GetSendString(void)
{
return this->xml;
}
Уже пытался сделать и _di_IXMLDocument *, IXMLDocument — не проходит, либо такой тип вообще задать нельзя либо несоответсвие типов...
Может знает кто что я упустил?