内容: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. 生活类App原型制作分享-AnyList

    AnyList是一款可以帮你创建购物清单,并且帮助你整理食谱的生活工具App,前面引导页采用图片+文字的方式,介绍App的用法,登录注册采用选项卡切换的方式,减少了页面切换的繁琐操作,在Mockplu ...

  2. Clover相关知识

    -f 重建驱动缓存 darkwake=4 有深度睡眠有关的设置,不懂 kext-dev-mode=1 启用第三方驱动,比较重要. dart=0 修复因开启 VT-d 导致系统启动时SMC五国错误,系统 ...

  3. jquery单行文字上下循环滚动

    html代码: <div class="box"> <div class="t_news"> <b>已关联奖励账号.昵称:& ...

  4. [C#]做服务使用Process启动外部程序没窗体

    这几天会到一个需要,要时时侦测文件生成,并上传到Server上,侦测文件生成使用的FileSystemWatch.但是时时运行遇到了问题,程序可能会人为退出或者意外终止,使用一个进程监控程序的监程,也 ...

  5. xml约束的概念

    1 xml 约束的概念 XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML ...

  6. go基础知识之变量,类型,常量,函数

    3 变量 变量是什么 变量指定了某存储单元(Memory Location)的名称,该存储单元会存储特定类型的值.在 Go 中,有多种语法用于声明变量. 声明单个变量 var name type 是声 ...

  7. 正则表达式,re模块

    一.正则表达式 正则表达式 : 匹配字符串,一般用于爬取数据. 正则表达式查询网址 : http://tool.chinaz.com/regex/?qq-pf-to=pcqq.group 1.元字符( ...

  8. jQuery Growl插件(消息提醒)

    ps:菜鸟教程 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <s ...

  9. 第18章:MongoDB-聚合操作--聚合管道--$sort

    ①$sort 使用“$sort”可以实现排序,设置1表示升序,设置-1表示降序. ②范例:实现排序

  10. VSS + Eclipse 管理源码