关于在BCB里面动态调用TXMLDocument

由于做EasyNews我开始使用TXMLDocument,但是很遗憾的是,出现了一些莫名其妙的错误。基本代码如下:


    //这里没有写错,TXMLDocument的构建函数就是这么定义的

    //很奇怪的做法,一般来说T打头的都是VCL类,需要一个宿主

    //但是这个类不需要宿主

    TXMLDocument* MyXml=new TXMLDocument("");

    try

    {

        MyXml->LoadFromFile("test.xml");

    }

    catch(...)

    {

        MyXml->DocumentElement=MyXml->CreateElement(

            "Test","http://www.tinydust.net/easynews");

    }

具体错误是,只要我的test.xml文件不存在或者不是合法的xml文件的时候,MyXml->CreateElement的运行也是错误的。这个错误很奇怪,我百思不得其解,开始认为可能是LoadFromFile失败以后,对MyXml对象的状态做了改变,比如关闭解析等等,但是却找不到判断这个状态和修改这个状态的函数。

我用Google搜索了一下,网上的代码都没有捕捉这个错误,没话说,现在的例程都是这样的,只要功能能实现,错误处理等等都被省略了,这样做出来的程序能可靠么?

最后,我在Borland的新闻组里面的Bcb->Xml部分找到了答案,Remy Lebeau (TeamB)说,不应该建立TXMLDocument的动态实例,而应该使用IXMLDocument接口,NewXMLDocument函数可以返回一个IXMLDocument接口实例。另外,不要手工释放IXMLDocument接口的实例,因为IXMLDocument接口的实例存会自动释放。

所以,我原来的程序被改成了:


    _di_IXMLDocument MyXML;

    try

    {

        MyXML=LoadXMLDocument("test.xml");

    }

    catch(...)

    {

        MyXML=NewXMLDocument();

        MyXML->DocumentElement=MyXML->CreateElement(

            "Test","http://www.tinydust.net/easynews");

    }

新的代码很稳定,没有出现任何问题,问题很容易就解决了,不过在找到这个文章前,我几乎浪费了一天去寻找原因,真是郁闷。谢谢Remy Lebeau (TeamB),不过话说回来,为什么BCB的文档里面不告诉我们呢,郁闷。

Written by gegewan on 九月 27th, 2008 with no comments.
Read more articles on C/C++.

Related articles

No comments

There are still no comments on this article.

Leave your comment...

If you want to leave your comment on this article, simply fill out the next form:




You can use these XHTML tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> .