Re[2]: Создание экземпляра TXMLDocument в Runtime
От: The_Jocker  
Дата: 18.02.03 08:34
Оценка:
Здравствуйте, 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 — не проходит, либо такой тип вообще задать нельзя либо несоответсвие типов...
Может знает кто что я упустил?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.