内容:VC2010和VC2017的标准库中,string(或wstring)的数据结构和操作有所不同,所以在将这两种数据作为参数在两个系统产生的函数中传递时会出现乱码(string和wstring在2017下必须是引用传递)
最近完成了VS207下Skia 32位库的编译,并将其运用于基于VC2010的一个系统。在使用过程中出现的问题有时莫名其妙。这里有一个例子值得记住:
例子1:其中的一个函数用于Skia绘制汉字:
CStringA fname = mFont.lfFaceName;
CStringA text = FHt[i];
m_pMarkLib->DrawTextL(pst, text, mFont.lfEscapement * 10.0, FSize.tmHeight, fname, cr);
pst是屏幕坐标,text是要显示的文字(CStringA),mFont.lfEscapement * 10.0是倾斜角,
FSize.tmHeight是字的大小,fname是字体名称(CStringA),cr是颜色。
接下来DrawTextL调用两个2017下动态库中的类CMarkShader类(对象是m_GShader)的成员函数
void CMklib::DrawTextL(CPoint pt, CString text, double angle, int size, CStringA fname, COLORREF rcolor)
{
CStringW wtext(text);
std::wstring str = wtext.GetBuffer();
wtext.ReleaseBuffer();
msPoint c;
c.X = pt.x;
c.Y = pt.y;
unsigned int color = m_GShader.RGBAToUInt(GetRValue(rcolor), GetGValue(rcolor), GetBValue(rcolor), 255);
std::string sfname = fname.GetBuffer();
fname.ReleaseBuffer();
m_GShader.setFont_c(sfname.c_str(), color, size);
//OutputDebugString("DrawTextL");
//OutputDebugStringW(str.c_str());
int len = str.length();
m_GShader.DrawStringW((void*)str.c_str(), len, pt.x, pt.y, size, angle, c);
}
这两个函数分别是m_GShader.setFont_c 和m_GShader.DrawStringW。最初这两个函数的第一个参数分别是std::string &和std::wstring&。此时两个函数都会产生异常,DrawStringW函数画出的汉字还是乱码。经过两天的观察和思考,发现原因是VC2010和VC2017的std::string 和std::wstring 实现有差异(这是我的猜测)。因为同样的std::wstring数据在2010中能够正常,作为参数进入VC2017函数中就会成为乱码。所以,我们参数改为直接将其内存块传进去,成功!