И при первом обращении к X->DocumentElement получаю AV: read of mem...
Причем, если создать экземпляр в Designtime, все ОК.
Что я делаю неправильно?
Среда: Borland C++Builder 6.0.
Операционка: Win2000, WinXP
Здравствуйте, 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 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Судя по документации, основное различие этих объектов, созданных в дизайне и в рантайме (точнее, созданных при помощи разных версий конструктора), состоит в их времени жизни. S>Созданные в дизайне инстансы TXMLDocument убиваются их Owner'ом. Т.е. они живы, пока жива форма-их хозяин. S>Те же, которые созданы указанным вами способом, живут до тех пор, пока есть ссылки на их интерфейс IXMLDocument. S>Скорее всего, в этом и есть корень всех зол — где-то между моментом создания объекта и обращением к его DocumentElement происходит внезапная смерть. Рекомендую попробовать сделать X указателем на IXMLDocument вместо указателя на TXMLDocument.
Об этом я думал...
Но как я сделаю X указателем на IXMLDocument, когда конструктор возвращает тип TXMLDocument. Использовать явное приведение типов?
Здравствуйте, 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::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 — не проходит, либо такой тип вообще задать нельзя либо несоответсвие типов...
Может знает кто что я упустил?
Здравствуйте, 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) ни к чему не привел: ошибка та же. Видимо, дело не в этом...
Здравствуйте, ProgZ, Вы писали:
PZ>Об этом я думал... PZ>Но как я сделаю X указателем на IXMLDocument, когда конструктор возвращает тип TXMLDocument. Использовать явное приведение типов?
Я точно не знаю, каким образом надо получать интерфейсы в BCB. Скорее всего, надо либо использовать явное приведение, либо QueryInterface.
... << RSDN@Home 1.0 beta 6 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, The_Jocker, Вы писали:
TJ>Уже пытался сделать и _di_IXMLDocument *, IXMLDocument — не проходит, либо такой тип вообще задать нельзя либо несоответсвие типов... TJ>Может знает кто что я упустил?
Я так понимаю, ты упустил отсутствие необходимости вызывать delete. Для TXMLDocument * его не надо вызывать вообще никогда. Созданные в дизайн-тайме, или в рантайме с конструктором компонента (в который передается owner) будут убиты хозяином. Созданные в рантайме с параметром — именем файла умрут сами, как только не останется ссылок на IXMLDocument.
... << RSDN@Home 1.0 beta 6 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, 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 дело просто не доходит...
Здравствуйте, 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".
Здравствуйте, 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 из-за этого гемороя...
Здравствуйте, 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>
Здравствуйте, 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.
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, ведь он хочет имя файла?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, 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, ведь он хочет имя файла?