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

来源:https://www.cnblogs.com/myboat/archive/2018/10/28/9867041.html
-Advertisement-
Play Games

VC2010和VC2017的標準庫中,string(或wstring)的數據結構和操作有所不同,所以在將這兩種數據作為參數在兩個系統產生的函數中傳遞時會出現亂碼(string和wstring在2017下必須是引用傳遞) ...


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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在開發過程中,需要修改資料庫模型,而且還要在修改之後更新資料庫。最直接的方式就是刪除舊表,但這樣會丟失數據。 更好的解決辦法是使用資料庫遷移框架,它可以追蹤資料庫模式的變化,然後把變動應用到資料庫中。 在Flask中可以使用Flask-Migrate擴展,來實現數據遷移。並且集成到Flask-Scr ...
  • 我們都知道程式員花費大量的時間在編寫、閱讀和編輯代碼上,因此一定要使用高效的文本編輯器才能夠提高並很好的完成工作的效率和保證工作的質量。 什麼是高效的文本編輯器呢?除了自己用的得心應手外,小U認為還應該包含以下幾個特點: ·突出代碼的結構,讓你在編寫代碼時就能夠發現常見的bug; 本人微信:mmp9 ...
  • 題目描述 已知:Sn​=1+1/2+1/3+…+1/n。顯然對於任意一個整數K,當n足夠大的時候,Sn​大於K。 現給出一個整數K(1≤K≤15),要求計算出一個最小的n;使得Sn​>K。 輸入輸出格式 輸入格式: 一個正整數K 輸出格式: 一個正整數N 輸入樣例:1 輸出樣例:2 答案代碼: #i ...
  • 一、前言 之前ZYNQ與PC之間的網路連接依賴於外接硬體協議棧晶元,雖然C驅動非常簡單,但網路帶寬受限。現採用LWIP+PS端MAC控制器+PHY晶元的通用架構。關於LWIP庫,已經有很多現成的資料和書籍。其有兩套API,一個是SOCKET,另一個是本例中要用到的RAW。RAW API理解起來較為復 ...
  • 在這裡我要實現的是Spring的IOC和AOP的核心,而且有關IOC的實現,註解+XML能混合使用! 參考資料: IOC:控制反轉(Inversion of Control,縮寫為IoC),是面向對象編程中的一種設計原則,可以用來減低電腦代碼之間的耦合度。其中最常見的方式叫做依賴註入(Depend ...
  • dfs
    sdfsf ...
  • 前言 這篇文章是WPF框架系列的最後一篇,在這裡我想闡述一下我對框架設計的理解。 我對框架設計的理解是這樣的: 框架設計不應該局限於任何一種設計模式,我們在設計框架時,應該將設計模式揉碎,再重組;這樣設計出來的框架才具有一戰之力。 框架設計應該根據項目團隊成員水平量身定製。 我上一篇文章《我們都知道 ...
  • Console.WriteLine("100-1000的水仙花數有"); for (int i = 100; i < 1000; i++) { int a = i / 100 % 10;//百位 int b = i / 10 % 10;//十位 int c = i % 10;//個位 if (a * ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...