Создание экземпляра TXMLDocument в Runtime
От: ProgZ www.progz.ru
Дата: 17.02.03 13:18
Оценка:
Пытаюсь создать экземпляр класса TXMLDocument:
TXMLDocument *X = new TXMLDocument("test.xml");

И при первом обращении к X->DocumentElement получаю AV: read of mem...
Причем, если создать экземпляр в Designtime, все ОК.
Что я делаю неправильно?
Среда: Borland C++Builder 6.0.
Операционка: Win2000, WinXP
Re: Создание экземпляра TXMLDocument в Runtime
От: Sinclair Россия https://github.com/evilguest/
Дата: 17.02.03 13:46
Оценка:
Здравствуйте, ProgZ, Вы писали:

PZ>Пытаюсь создать экземпляр класса TXMLDocument:

PZ>
TXMLDocument *X = new TXMLDocument("test.xml");

PZ>И при первом обращении к X->DocumentElement получаю AV: read of mem...
PZ>Причем, если создать экземпляр в Designtime, все ОК.
PZ>Что я делаю неправильно?
Судя по документации, основное различие этих объектов, созданных в дизайне и в рантайме (точнее, созданных при помощи разных версий конструктора), состоит в их времени жизни.
Созданные в дизайне инстансы TXMLDocument убиваются их Owner'ом. Т.е. они живы, пока жива форма-их хозяин.
Те же, которые созданы указанным вами способом, живут до тех пор, пока есть ссылки на их интерфейс IXMLDocument.
Скорее всего, в этом и есть корень всех зол — где-то между моментом создания объекта и обращением к его DocumentElement происходит внезапная смерть. Рекомендую попробовать сделать X указателем на IXMLDocument вместо указателя на TXMLDocument.
... << RSDN@Home 1.0 beta 6 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Создание экземпляра TXMLDocument в Runtime
От: ProgZ www.progz.ru
Дата: 17.02.03 13:52
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Судя по документации, основное различие этих объектов, созданных в дизайне и в рантайме (точнее, созданных при помощи разных версий конструктора), состоит в их времени жизни.

S>Созданные в дизайне инстансы TXMLDocument убиваются их Owner'ом. Т.е. они живы, пока жива форма-их хозяин.
S>Те же, которые созданы указанным вами способом, живут до тех пор, пока есть ссылки на их интерфейс IXMLDocument.
S>Скорее всего, в этом и есть корень всех зол — где-то между моментом создания объекта и обращением к его DocumentElement происходит внезапная смерть. Рекомендую попробовать сделать X указателем на IXMLDocument вместо указателя на TXMLDocument.

Об этом я думал...
Но как я сделаю X указателем на IXMLDocument, когда конструктор возвращает тип TXMLDocument. Использовать явное приведение типов?
Re: Создание экземпляра TXMLDocument в Runtime
От: DemAS http://demas.me
Дата: 18.02.03 06:00
Оценка:
Здравствуйте, ProgZ, Вы писали:

PZ>Пытаюсь создать экземпляр класса TXMLDocument:

PZ>
TXMLDocument *X = new TXMLDocument("test.xml");

PZ>И при первом обращении к X->DocumentElement получаю AV: read of mem...

Если не ошибаюсь, перед созданием экземпляра TXMLDocument необходимо сказать CoInitialize(nil); Но это в Дельфях, о думаю, что в BCB тоже самое.

P.S. Прошу прощения, если я что-то перепутал.
... <<Слушаю Katatonia — In Death, A Song >>
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 — не проходит, либо такой тип вообще задать нельзя либо несоответсвие типов...
Может знает кто что я упустил?
Re[2]: Создание экземпляра TXMLDocument в Runtime
От: ProgZ www.progz.ru
Дата: 18.02.03 10:09
Оценка:
Здравствуйте, DemAS, Вы писали:

PZ>>Пытаюсь создать экземпляр класса TXMLDocument:

PZ>>
TXMLDocument *X = new TXMLDocument("test.xml");

PZ>>И при первом обращении к X->DocumentElement получаю AV: read of mem...

DAS> Если не ошибаюсь, перед созданием экземпляра TXMLDocument необходимо сказать CoInitialize(nil); Но это в Дельфях, о думаю, что в BCB тоже самое.


Эта мысль тоже приходила мне в голову, ведь реализация MSXML построена в виде COM-объектов. Однако, CoInitialize(NULL) ни к чему не привел: ошибка та же. Видимо, дело не в этом...
Re[3]: Создание экземпляра TXMLDocument в Runtime
От: The_Jocker  
Дата: 18.02.03 10:54
Оценка:
Здравствуйте, ProgZ, Вы писали:


PZ>>>Пытаюсь создать экземпляр класса TXMLDocument:

PZ>>>
TXMLDocument *X = new TXMLDocument("test.xml");

PZ>>>И при первом обращении к X->DocumentElement получаю AV: read of mem...

А если debug сделать и посмотреть что там получается в X после new?
в особености X->XML->Text
Re[3]: Создание экземпляра TXMLDocument в Runtime
От: Sinclair Россия https://github.com/evilguest/
Дата: 18.02.03 14:16
Оценка:
Здравствуйте, ProgZ, Вы писали:

PZ>Об этом я думал...

PZ>Но как я сделаю X указателем на IXMLDocument, когда конструктор возвращает тип TXMLDocument. Использовать явное приведение типов?
Я точно не знаю, каким образом надо получать интерфейсы в BCB. Скорее всего, надо либо использовать явное приведение, либо QueryInterface.
... << RSDN@Home 1.0 beta 6 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[3]: Создание экземпляра TXMLDocument в Runtime
От: Sinclair Россия https://github.com/evilguest/
Дата: 18.02.03 14:21
Оценка:
Здравствуйте, The_Jocker, Вы писали:

TJ>Уже пытался сделать и _di_IXMLDocument *, IXMLDocument — не проходит, либо такой тип вообще задать нельзя либо несоответсвие типов...

TJ>Может знает кто что я упустил?
Я так понимаю, ты упустил отсутствие необходимости вызывать delete. Для TXMLDocument * его не надо вызывать вообще никогда. Созданные в дизайн-тайме, или в рантайме с конструктором компонента (в который передается owner) будут убиты хозяином. Созданные в рантайме с параметром — именем файла умрут сами, как только не останется ссылок на IXMLDocument.
... << RSDN@Home 1.0 beta 6 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: Создание экземпляра TXMLDocument в Runtime
От: ProgZ www.progz.ru
Дата: 18.02.03 14:24
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Я точно не знаю, каким образом надо получать интерфейсы в BCB. Скорее всего, надо либо использовать явное приведение, либо QueryInterface.


Через явное приведение типов не получается. Это все же разные классы...
А через QueryInterface — это напряжно. Если так, то можно обойтись вообще без TXMLDocument, а импортировать интерфейсы из msxml.dll и работать с ними как с обычными COM-объектами. Но это геморойно!
Re[4]: Создание экземпляра TXMLDocument в Runtime
От: Аноним  
Дата: 18.02.03 14:54
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Я так понимаю, ты упустил отсутствие необходимости вызывать delete. Для TXMLDocument * его не надо вызывать вообще никогда. Созданные в дизайн-тайме, или в рантайме с конструктором компонента (в который передается owner) будут убиты хозяином. Созданные в рантайме с параметром — именем файла умрут сами, как только не останется ссылок на IXMLDocument.


Дело в том, что я по сути не успеваю ничего прибить. Я только создаю объект и пытаюсь обратиться к DocumentElement. До delete дело просто не доходит...
Re[4]: Создание экземпляра TXMLDocument в Runtime
От: ProgZ www.progz.ru
Дата: 18.02.03 14:58
Оценка:
Здравствуйте, The_Jocker, Вы писали:

TJ>А если debug сделать и посмотреть что там получается в X после new?

TJ>в особености X->XML->Text

X->XML->Text — все ОК! Там как раз текст XML-файла. А X->DocumentElement даже посмотреть не удается — Watch пишет что-то типа "function terminated by unhandled exception...". Ну а при запуске выдает AV или вообще "Abstract Error".
Re[5]: Создание экземпляра TXMLDocument в Runtime
От: The_Jocker  
Дата: 26.02.03 14:37
Оценка:
Здравствуйте, ProgZ, Вы писали:

PZ>Здравствуйте, The_Jocker, Вы писали:


TJ>>А если debug сделать и посмотреть что там получается в X после new?

TJ>>в особености X->XML->Text

X->>XML->Text — все ОК! Там как раз текст XML-файла. А X->DocumentElement даже посмотреть не удается — Watch пишет что-то типа "function terminated by unhandled exception...". Ну а при запуске выдает AV или вообще "Abstract Error".


Мда... та же самая история... первое обращение к DocumentElement и мы в пролете с AV.
Есть тут мысли возможно нам надо DTD определить перед загрузкой XML, ибо видел похожие топики из Visual C++ где люди не моглю получить узлы до тех пор пока не описывали DTD, после чего они становились доступными...

P.S.
Я уже отказался от TXMLDocument из-за этого гемороя...
Re: Создание экземпляра TXMLDocument в Runtime
От: AGAMEMNUM  
Дата: 27.02.03 13:38
Оценка:
Здравствуйте, ProgZ, Вы писали:

PZ>Пытаюсь создать экземпляр класса TXMLDocument:

PZ>
TXMLDocument *X = new TXMLDocument("test.xml");

PZ>И при первом обращении к X->DocumentElement получаю AV: read of mem...
PZ>Причем, если создать экземпляр в Designtime, все ОК.
PZ>Что я делаю неправильно?
PZ>Среда: Borland C++Builder 6.0.
PZ>Операционка: Win2000, WinXP
PZ>

CoCreateInstance
Re: Создание экземпляра TXMLDocument в Runtime
От: Kluge  
Дата: 03.03.03 12:03
Оценка:
Здравствуйте, ProgZ, Вы писали:

PZ>Пытаюсь создать экземпляр класса TXMLDocument:

PZ>
TXMLDocument *X = new TXMLDocument("test.xml");

PZ>И при первом обращении к X->DocumentElement получаю AV: read of mem...
PZ>Причем, если создать экземпляр в Designtime, все ОК.
PZ>Что я делаю неправильно?
PZ>Среда: Borland C++Builder 6.0.
PZ>Операционка: Win2000, WinXP
PZ>

Либо QueryInterface (не проверено),
либо в конструктор передавать TComponent и им определять время жизни,
либо x->DOMDocument->DocumentElement.

Я использую второй вариант всё работает.
Лоботомию в массы! (с)
Re[6]: Создание экземпляра TXMLDocument в Runtime
От: Мясной  
Дата: 22.04.03 10:29
Оценка:
T_J>P.S.
T_J>Я уже отказался от TXMLDocument из-за этого гемороя...

А чем пользуешься вместо, если не секрет?
Тоже бы хотелось компонентик какой для работы с XML.
Re[2]: Создание экземпляра TXMLDocument в Runtime
От: Аноним  
Дата: 18.03.05 12:54
Оценка:
Здравствуйте, Kluge, Вы писали:

K>Здравствуйте, ProgZ, Вы писали:


PZ>>Пытаюсь создать экземпляр класса TXMLDocument:

PZ>>
TXMLDocument *X = new TXMLDocument("test.xml");

PZ>>И при первом обращении к X->DocumentElement получаю AV: read of mem...
PZ>>Причем, если создать экземпляр в Designtime, все ОК.
PZ>>Что я делаю неправильно?
PZ>>Среда: Borland C++Builder 6.0.
PZ>>Операционка: Win2000, WinXP
PZ>>

K>Либо QueryInterface (не проверено),

K>либо в конструктор передавать TComponent и им определять время жизни,
K>либо x->DOMDocument->DocumentElement.

K>Я использую второй вариант всё работает.


А как в конструктор передать TComponent, ведь он хочет имя файла?
Re[3]: Создание экземпляра TXMLDocument в Runtime
От: Eldorado  
Дата: 18.03.05 13:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Kluge, Вы писали:


K>>Здравствуйте, ProgZ, Вы писали:


PZ>>>Пытаюсь создать экземпляр класса TXMLDocument:

PZ>>>
TXMLDocument *X = new TXMLDocument("test.xml");

PZ>>>И при первом обращении к X->DocumentElement получаю AV: read of mem...
PZ>>>Причем, если создать экземпляр в Designtime, все ОК.
PZ>>>Что я делаю неправильно?
PZ>>>Среда: Borland C++Builder 6.0.
PZ>>>Операционка: Win2000, WinXP
PZ>>>

K>>Либо QueryInterface (не проверено),

K>>либо в конструктор передавать TComponent и им определять время жизни,
K>>либо x->DOMDocument->DocumentElement.

K>>Я использую второй вариант всё работает.


А>А как в конструктор передать TComponent, ведь он хочет имя файла?



Аноним был я...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.