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