由VC2010与VC2017数据结构差异造成的程序错误
內(nèi)容:VC2010和VC2017的標(biāo)準(zhǔn)庫(kù)中,string(或wstring)的數(shù)據(jù)結(jié)構(gòu)和操作有所不同,所以在將這兩種數(shù)據(jù)作為參數(shù)在兩個(gè)系統(tǒng)產(chǎn)生的函數(shù)中傳遞時(shí)會(huì)出現(xiàn)亂碼(string和wstring在2017下必須是引用傳遞)
最近完成了VS207下Skia 32位庫(kù)的編譯,并將其運(yùn)用于基于VC2010的一個(gè)系統(tǒng)。在使用過(guò)程中出現(xiàn)的問(wèn)題有時(shí)莫名其妙。這里有一個(gè)例子值得記住:
例子1:其中的一個(gè)函數(shù)用于Skia繪制漢字:
CStringA fname = mFont.lfFaceName;
CStringA text = FHt[i];
m_pMarkLib->DrawTextL(pst, text, mFont.lfEscapement * 10.0, FSize.tmHeight, fname, cr);?
pst是屏幕坐標(biāo),text是要顯示的文字(CStringA),mFont.lfEscapement * 10.0是傾斜角,
FSize.tmHeight是字的大小,fname是字體名稱(CStringA),cr是顏色。
接下來(lái)DrawTextL調(diào)用兩個(gè)2017下動(dòng)態(tài)庫(kù)中的類CMarkShader類(對(duì)象是m_GShader)的成員函數(shù)
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);
}
這兩個(gè)函數(shù)分別是m_GShader.setFont_c 和m_GShader.DrawStringW。最初這兩個(gè)函數(shù)的第一個(gè)參數(shù)分別是std::string &和std::wstring&。此時(shí)兩個(gè)函數(shù)都會(huì)產(chǎn)生異常,DrawStringW函數(shù)畫出的漢字還是亂碼。經(jīng)過(guò)兩天的觀察和思考,發(fā)現(xiàn)原因是VC2010和VC2017的std::string?和std::wstring?實(shí)現(xiàn)有差異(這是我的猜測(cè))。因?yàn)橥瑯拥膕td::wstring數(shù)據(jù)在2010中能夠正常,作為參數(shù)進(jìn)入VC2017函數(shù)中就會(huì)成為亂碼。所以,我們參數(shù)改為直接將其內(nèi)存塊傳進(jìn)去,成功!
?
轉(zhuǎn)載于:https://www.cnblogs.com/myboat/p/9867041.html
總結(jié)
以上是生活随笔為你收集整理的由VC2010与VC2017数据结构差异造成的程序错误的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 那些开源协议可以商用
- 下一篇: 【Qt Quick】配置vc2017环境