Archive for the ‘C/C++’ Category

BCB UTF-8 格式转换

如果是字串转换.BCB有多个方法(如TStringConverter,或API的 WideCharToMultiByte/MultiByteToWideChar,VCL的WideCharToString/StringToWideChar等)
当然,BCB本身就支持三种字串,前两种可自动转,后一种有函数:
String x; //GBK
WideString y; //unicode
UTF8String z; //utf8
x=y; //自动
y=x; //自动
z=AnsiToUtf8(x);
x=Utf8ToAnsi(z);

C++ builder中动态改变浏览器中的内容

先在浏览器中放一个浏览器控件,名字叫wb,然后用下面的代码来实现

 

void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{
    IDispatch *wdoc = static_cast<IDispatch *>(wb->Document);
    IHTMLDocument2* pHtmlDoc2 = static_cast<IHTMLDocument2 *>(wdoc);
    if(pHtmlDoc2){
        HRESULT hr = S_OK;
        IHTMLElement *pBodyElement;
        hr=pHtmlDoc2->get_body(&pBodyElement); 
        if(pBodyElement!=NULL)  
        {     
            BSTR pbBody = L"中文测试";
            hr=pBodyElement->put_innerHTML(pbBody);   //类似的还有put_innerTEXT
            pBodyElement->Release();  
        }     
        pHtmlDoc2->Release(); 
        //if( hr==S_FALSE) return FALSE;
        //else return TRUE;
    }
    //else return FALSE;

}

已经实验过的,在2009中中文UTF8是正常显示的,貌似先前加载的css和js也是可以使用的,如果浏览器没有先加载过网页这段代码是不能使用的,不会报错

关于在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的文档里面不告诉我们呢,郁闷。