内容: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数据结构差异造成的程序错误的更多相关文章

  1. Openstack的mysql数据多主galera的错误

    登录openstack的在dashboard,提示说权限验证错误,有2种情况: 1. 密码被人改了. 2. 系统发生了问题. 密码确认没人改,所以查看/var/log/keystone-all.log ...

  2. ALV判断修改后是否有不合法数据,有则选中错误行,高亮度显示。

    alv数据表维护表时错误行需要高亮度显示 gt_index_rows TYPE lvc_t_row,"用以存放要选择行的内表 gs_index_rows TYPE lvc_s_row.&qu ...

  3. Atitit.软件GUIbutton与仪表盘--db数据库区--导入mysql sql错误的解决之道

    Atitit.软件GUIbutton与仪表盘--db数据库区--导入mysql sql错误的解决之道 Keyword::截取文本文件后部分 查看提示max_allowed_packet限制 Targe ...

  4. asp.net mvc3 数据验证(二)——错误信息的自定义及其本地化

    原文:asp.net mvc3 数据验证(二)--错误信息的自定义及其本地化 一.自定义错误信息         在上一篇文章中所做的验证,在界面上提示的信息都是系统自带的,有些读起来比较生硬.比如: ...

  5. Reporting Service 2008 “报表服务器数据库内出错。此错误可能是因连接失败、超时或数据库中磁盘空间不足而导致的”

    今天遇到了两个关于Reporting Service的问题, 出现问题的环境为Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64) .具体情况 ...

  6. 微信小程序通过api接口将json数据展现到小程序示例

    这篇文章主要介绍了微信小程序通过api接口将json数据展现到小程序示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧实现知乎客户端的一个重要知识前提就是,要知道怎么通过 ...

  7. 手把手教你开发BLE数据透传应用程序

    如何开发BLE数据透传应用程序?什么是BLE service和characteristic?如何开发自己的service和characteristic?如何区分ATT和GATT?有没有什么工具可以对B ...

  8. Atitit.软件GUI按钮与仪表盘--db数据库区--导入mysql sql错误的解决之道

    Atitit.软件GUI按钮与仪表盘--db数据库区--导入mysql sql错误的解决之道 Keyword::截取文本文件后部分 查看提示max_allowed_packet限制 Target Se ...

  9. dsp28377控制DM9000收发数据——第三版程序,通过外部引脚触发来实现中断接受数据,优化掉帧现象

    //-------------------------------------------------------------------------------------------- - //D ...

随机推荐

  1. jvm 启动参数设置(转载)

    JVM启动参数 http://onlyor.iteye.com/blog/1722413 博客分类: java java java启动参数共分为三类其一是标准参数(-),所有的JVM实现都必须实现这些 ...

  2. Linux学习笔记:JDK安装

    系统为CentOS 7,安装Oracle jdk1.8 卸载系统自带的Openjdk(若无可跳过这一步,可以通过 java -version 查看),步骤是:查找Openjdk,卸载Openjdk r ...

  3. [vb.net]控制台进度条的示例

    Private Sub ConsoleProcessBar() Dim isBreak As Boolean = False Dim colorBack As ConsoleColor = Conso ...

  4. 过河卒(NOIP2002)

    题目链接:过河卒 直接模拟?会T掉60分. 所以我们可以采用递推,怎么想到的? 因为卒子只能向下或向右走,所以走到一个点的方法数,等于走到它上面点的方法数加上走到它左边点的方法数,这样就可以地推了. ...

  5. canvas绘图实现浏览器等待效果

    一:创建画布 <canvas width="600" height="600" id="canvas" style="bor ...

  6. Django的开始

    一 浏览器相关知识 http:只有依赖一回,属于短链接,不会报错客户端的信息. 浏览器相当于一个客户端,客户端的链接 服务端:socket服务端,起服务监听客户端的请求. import socket ...

  7. Hadoop3集群搭建之——hive添加自定义函数UDF

    上篇: Hadoop3集群搭建之——虚拟机安装 Hadoop3集群搭建之——安装hadoop,配置环境 Hadoop3集群搭建之——配置ntp服务 Hadoop3集群搭建之——hive安装 Hadoo ...

  8. Java设计模式——行为型模式

    行为型模式,共11种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 11种模式的关系: 第一类:通过父类与子类的关系 ...

  9. Vue + Element UI 实现权限管理系统

    Vue + Element UI 实现权限管理系统 前端篇(一):搭建开发环境 https://www.cnblogs.com/xifengxiaoma/p/9533018.html

  10. excel的小bug

    http://muchong.com/html/201710/3913047.html Excel也有相同现象,试着计算:exp(-1.5^2),exp(0-1.5^2),exp(-(1.5)^2)看 ...