1. 程式人生 > >由VC2010與VC2017數據結構差異造成的程序錯誤

由VC2010與VC2017數據結構差異造成的程序錯誤

poi 漢字 c_str tde 結構 rgba pst put sign

內容: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函數中就會成為亂碼。所以,我們參數改為直接將其內存塊傳進去,成功!

由VC2010與VC2017數據結構差異造成的程序錯誤