ATL 和 MFC 字符转换宏

2023-11-10

ATL MFC 字符转换宏 

ATL3.0

Ø     ATL3.0中的W2T ,T2W等一系列宏很方便,但一定要小心,它们从栈上分配内存,直到调用它的函数返回前,该内存不会被释放,如果在一个循环中,这类宏被你反复调用几万次时,你将不可避免地产生stack overflow 解决的方法是,将用到该宏的语句独立封装成一个函数,这样就可以无限次调用了。

Ø  ATL3.0的主要宏如下:

 

Ø  使用方法如下.

      #include <atlconv.h>

       void StringFunc(LPSTR lpsz)

       {

          USES_CONVERSION;

          LPWSTR x = A2W(lpsz);

          // Do something with x

       }

Ø   这些宏的名字有一它的意义, 被转换的字符在左边(: A) 转换后的字符在后边(:W)2表示To ALPSTR字符, OLE LPOLESTR字符, T LPTSTR字符, W LPWSTR字符。如果宏的名字中含有C,表示该宏将会转换成一个Const string,例如, W2CA LPWSTR 转换成LPCSTR., A2W LPSTR 转换成 LPWSTR, OLE2T LPOLESTR t转换成 LPTSTR……

Ø   ATL宏的行为取决于编译器指令生成效果,如果源字符和目的字符类型相同,就不会发生转换动作,编译器在预编译过程中将会将宏名种的TOLE参照如下表进行转换。

 

是否存在下列预编译宏

 

T 成为

OLE成为

没有定义

A

W

定义了_UNICODE

W

W

定义了OLE2ANSI

A

A

定义了_UNICODE OLE2ANSI

W

A

 

ATL7.0

 

Ø         ATL7.0增加了几种新的宏和类,对已有的宏做了很大的该进.

Ø    ATL7.0宏名形如如下形式 --- C(源字符类型)2[C](目的字符类型) [EX]

       其中:

·  源字符类型和目的字符类型参照下表。

· 如果目的字符类型要求是常量,则需要 [C]

·  如果需要以参数形式指定目的字符内存初始化大小,则需要[EX]

源字符类型/目的字符类型

      

A

ANSI character string.

W

Unicode character string.

T

Generic character string (equivalent to W when _UNICODE is defined, equivalent to A otherwise).

OLE

OLE character string (equivalent to W).

例如,将一个Unicode  string 转换成 普通string 而不改变源string ,可以用CW2CT。如果已经知道转换后的字符不会超过64个字符,可以选择含有EX的宏,并将大小限制以参数形式指定如:CW2CTEX<64>

Ø       ATL7.0新增的转换类: (CA2AEX, CA2WEX, CW2AEX, and CW2WEX) ,他们需要修正的静态存储区来保结果,如果转换后的字符过大,超出了静态存储区内存大小,这些类会自动释放内存,保证了安全性,避免了ATL3.0中宏在循环过程中会将栈占满。7.0对空字符的输入做了处理,如果输入为空字符,返回空,不会分配内存

Ø         部分代码如下

       #define COLE2T CW2T                                           #define COLE2TEX CW2TEX

       #define COLE2CT CW2CT                                      #define COLE2CTEX CW2CTEX

       #define CT2OLE CT2W                                           #define CT2OLEEX CT2WEX

       #define CT2COLE CT2CW                                      #define CT2COLEEX CT2CWEX

       class CW2WEX,                                                       class CA2AEX

       typedef CW2WEX<> CW2W                                  typedef CA2AEX<> CA2A

       class CA2CAEX                                                       class CW2CWEX

       typedef CA2CAEX<> CA2CA                                 typedef CW2CWEX<> CW2CW

       class CA2WEX                                                         class CW2AEX

    typedef CA2WEX<> CA2W                                    typedef CW2AEX<> CW2A

Ø        ATL3.0字符转换宏和ATL7.0字符转换宏和转换类的主要区别如下:

 

 

ATL 3.0 字符转换宏

             ATL 7.0字符转换类

在栈上分配内存

小字符在栈上分配,大字符在堆上分配

函数退出后,转换后的字符被释放

当超出一定的使用限制时,字符才被释放

没有意外情况处理

有意外情况处理

不适合在循环中使用

可以在循环中使用

栈空间有限, 不适合大字符

字符大小没有限制,可以在堆上分配内存

需要定义USES_CONVERSION

不需要定义USES_CONVERSION

OLE的类型取决于OLE2ANSI宏的定义

OLE类型总是和 W类型相同

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ATL 和 MFC 字符转换宏 的相关文章

  • 从字符串向量中删除方括号

    我有一个字符向量 其中每个元素都括在括号中 我想 去掉括号 只剩下字符串 所以我尝试 n c Dave Tony Sara paste n sep 不幸的是 由于某种原因这不起作用 在使用相同的代码之前我已经执行了相同的任务 并且不确定为什
  • 根据字符串列表查找第一个可用的序列号?

    给定一个字符串列表 例如 apple01 apple02 and apple04 banana02 cherry01 你会如何想出first可用序列号each类型 也就是说 apple03如果我问apple or banana01如果我问b
  • 检查字符串中是否存在所有字符值

    我目前正在做这项任务 但我被困住了 目标是读取文件并查找文件中的字符串中是否存在这些字符值 我必须将文件中的字符串与作为参数放入的另一个字符串进行比较 但是 只要每个字符值位于文件中的字符串中 那么它就 匹配 示例 输入和输出 a out
  • 如何使Python格式的浮点数具有一定数量的有效数字?

    我希望我的 Python 2 4 3 输出数字具有特定的格式 具体来说 如果数字是有效数字 6 位有效数字 则仅输出 6 位有效数字 A 显示了 Python 如何编写浮点数 B 显示了我希望它们如何书写 我怎样才能让Python以这种方式
  • MFC:从另一个线程调用 CWnd 方法安全吗?

    其实我有两个问题 打电话安全吗SendMessage来自工作线程 Do CWnd方法 比如MessageBox 调用API函数SendMessage幕后 根据我的理解 当工作线程调用时SendMessage 它将消息推送到UI线程的消息队列
  • 计算字符串的所有子串中子序列的出现次数

    我想编写一个算法来计算字符串的所有子字符串中字符子序列 不相交 出现的总数 下面是一个例子 字符串 jabcohnnyjohnny 后续 约翰尼 包含子序列的子字符串 jabcohnny jabcohnnyj jabcohnnyjo jab
  • 如何在 Javascript 中附加或连接字符串?

    所以我试图添加到一个字符串 但它显示为空 var DNA TAG var mRNA m RNA function check a b string if string a mRNA concat b function m RNA conso
  • String.Format 小数,带有千位分隔符和强制小数位

    我想String Format小数 使其同时具有千位分隔符和强制小数位 3 例如 Input 123456 12 78545 8 Output 123 456 120 78 545 800 我努力了 String Format 0 0 0
  • 如何使用 Swift 4 将字符串拆分为英语和非英语?

    我有一个包含英语和阿拉伯语的字符串 我正在使用 API 这就是为什么我无法在其中设置指标的原因 我想要得到的是 阿拉伯语和英语分成两部分 这是一个示例字符串 Bismika rabbee wadaAAtu janbee wabika arf
  • R::bigmemory - 如何创建角色big.matrix?

    我尝试使用bigmemory封装在R我一开始就陷入困境 我愿意 temp lt matrix paste a 1 10 5 2 并得到一个字符矩阵 没关系 但后来我尝试 x lt as big matrix temp type char 我
  • 具有多行值的 PEP8 多行字典

    我使用 Black for Python 它符合 PEP8 https github com psf black the black code style 它删除两行长值字符串的第二行的缩进 mydict key0 value0 key1
  • Android - 如何获取文本视图中字符的坐标

    是否可以从 Android 中的 TextView 中的字符获取 x 坐标 我不是在寻找 TextView 本身的坐标 我需要 TextView 中最后一个字符的坐标 多行 提前致谢 Java解决方案 以下是如何获得x and y特定字符的
  • 有没有更简单的方法来分割/重建字符串?

    目前我正在使用String split 像这样 String tmp props get i getFullName split String name for int j 1 j lt tmp length j if j gt 1 nam
  • 不使用 length() 方法的字符串长度[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 如何在不使用字符串的情况下找到字符串的长度length String类的方法 str toCharArray length应该管用 或者怎么
  • 是否有用于 C 字符串的标准 C++ 迭代器?

    有时我需要使用通用 C 迭代器范围接口将 C 字符串传递给函数 first last 是否有针对这些情况的标准 C 迭代器类 或者无需复制字符串或调用的标准方法strlen 编辑 我知道我可以使用指针作为迭代器 但我必须知道字符串在哪里结束
  • 在字符串中间添加一个字符

    可能有一个简单的解决方案可以解决这个问题 但会引起面部表情 我将时间存储为 4 个字符长的字符串 即 1300 我试图将该字符串显示为 13 00 我觉得必须有一个比我现在正在做的更优雅的解决方案 我目前有 startTime get fi
  • gcc 没有小字符串优化吗?

    Most std string实现 包括 GCC 使用小字符串优化 例如 有一个answer https stackoverflow com a 21710033 2640636讨论这个 今天 我决定检查我编译的代码中的字符串在什么时候被移
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • Python:字符串不会转换为浮点数[重复]

    这个问题在这里已经有答案了 我几个小时前写了这个程序 while True print What would you like me to double line raw input gt if line done break else f
  • 在python中,如何仅搜索所选子字符串之前的一个单词

    给定文本文件中的长行列表 我只想返回紧邻其前面的子字符串 例如单词狗 描述狗的单词 例如 假设有这些行包含狗 hotdog big dog is dogged dog spy with my dog brown dogs 在这种情况下 期望

随机推荐

  • Seaweedfs部署

    软件下载地址 https github com seaweedfs seaweedfs releases 创建工作目录 mkdir wkspace contribs seaweedfs 将下载的组件包放到此目录下 解压组件包 tar xvf
  • tar打包隐藏文件

    默认情况下 tar打包当前目录是不会包含隐藏文件的 但奇葩的是 他会包含当前目录子目录下的隐藏文件 bm6j80 aaa find aa aa cc bb bm6j80 aaa tar cvf test tar aa aa cc bb bm
  • 数组对象深拷贝

    数组对象深拷贝再研究 常见的深层数组对象拷贝方式有 concat 解构 JSON解析 函数递归等 concat var ary2 ary1 concat es6解构 var ary2 ary1 var ary2 ary1 JSON解析 va
  • 6行代码最简单的VB6标准DLL工程

    vb6可以做标准DLL方法很简单 利用了一个微软未公开的方法 不需要LINK工具 牛人还可以把DLL加上多线程等功能 再加上VB头初始化 VB6标准DLL就无所不能了 VB6做的控件 又是标准DLL 又是COM对象 还可以单文件运行 exe
  • Spring3学习笔记之(spring core 之DI(Bean作用域))

    Bean的作用域 什么是作用域呢 即 scope 在面向对象程序设计中一般指对象或变量之间的可见范围 而在Spring容器中是指其创建的Bean对象相对于其他Bean对象的请求可见范围 Spring提供 singleton 和 protot
  • 深度强化学习系列: “奖励函数”的设计和设置(reward shaping)

    概述 前面已经讲了好几篇关于强化学习的概述 算法 DPG gt DDPG 也包括对环境OpenAI gym的安装 baseline算法的运行和填坑 虽然讲了这么多 算法也能够正常运行还取得不错的效果 但是一直以来忽略了一个非常重要的话题 那
  • 【100%通过率 】华为O机试C++/java/python【箱子之字形摆放】 2022 Q4 A卷

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 有一批箱子 形式为字符串 设为str 要求将这批箱子按从上到下以之字形的顺序摆放在宽度为 n 的空地 请输出箱子的摆放位置 例如 箱子ABCDE
  • Yolov5的安装配置及实现目标检测

    本文内容 本文主要介绍anaconda下yolov5的安装配置方法 以及如何实现目标检测 目录 一 yolov5的下载安装 一 环境配置 二 下载yolov5 二 yolov5测试 一 图片测试 二 视频测试 三 调用手机摄像头实现实时检测
  • 如何使用 Docker 部署 FreeGPT-WebUI:一个简单的教程

    目录 1 FreeGPT WebUI 项目简介 2 安装 Docker 3 从 Docker Hub 拉取 FreeGPT WebUI 镜像 4 使用 Docker 运行 FreeGPT WebUI 应用程序 5 访问 FreeGPT We
  • python菜鸟学习Day1(数据类型)

    第一节 数据类型 int 整型 python2中有int long python3中只有int float 浮点型 string 字符串型 bool 布尔型 变量命名 字母 数字 下划线 数据不能开头 大小写敏感 不能和系统关键字 函数名
  • [2020.1.19][udev] 金步国udev

    金步国index里有4条udev相关的 1 udevadm 2 udev 3 systemd udevd service udevd守护进程 4 udev conf 1 udevadm 1 udevadm info options devp
  • linux 安装nginx+php +mysql 安装

    安装make make命令是GNU的工程化编译工具 用于编译众多相互关联的源代码问价 以实现工程化的管理 提高开发效率 安装PCRE库 g wget yum y install gcc gcc c wget pcre pcre devel
  • IP 地址解析与子网划分教程

    数据来源 一 简单局域网的构成 局域网 一般称为内网 简单局域网的构成 交换机 网线 PC 其他IT终端 交换机 用来组建内网的局域网的设备 交换机并不能让电脑上网 需要通过路由器 路由器 路由器可以为局域网自动分配IP和虚拟拨号 电脑需要
  • 高精度减法详解

    高精度减法详解 建议先学习高精度加法 高精度加法详解 当减数 被减数 差特别大时 大到无法用long long来存储 外面就需要使用高精度算法解决 算法基本思想 存储就是和加法差不多 都是用数组解决问题 计算就使用小学竖式计算即可 算法描述
  • 设计模式-桥接模式(Bridge)

    文章目录 前言 一 桥接模式的概念 二 桥接模式的实现 三 桥接模式的优缺点 1 优点 2 缺点 前言 桥接模式 Bridge Pattern 是一种结构型设计模式 用于将抽象部分和实现部分分离 使它们可以独立地变化 这种分离允许你将一个类
  • 【精】【PDF链接转图片】- Java用pdfbox将PDF的URL转换并压缩成图片,解决“口口口”乱码问题

    业务场景 做一个开电子发票的业务 中税返回我们一个pdf的url 这个url在web端是可以显示的 移动端 ios可以正常显示 安卓显示为是否要下载 产品邀请发票预览需让用户第一时间看到 不应该有下载的场景出现 解决方案 将PDF转化图片流
  • http://www.clamav.org/

    url http www clamav org url Clam AntiVirus is an open source GPL anti virus toolkit for UNIX designed especially for e m
  • 发送邮件验证码 php,PHP(ThinkPHP5.0) + PHPMailer 进行邮箱发送验证码

    GitHub下载最新版第三方类库PHPMailer php 第一步 html 打开网址https github com PHPMailer PHPMailer 下载PHPMailer PHPMailer 须要 PHP 的 sockets 扩
  • 柔性数组简介:

    个人主页 勇敢的小牛儿 推荐专栏 C语言知识点 座右铭 敢于尝试才有机会 今日鸡汤 我们应该尽可能的花精力 做到有多牛 而不是用很多无用的努力 让自己显得有多牛 一 柔性数组简介 1 柔性数组首先是一个数组 2 柔性数组之所以叫柔性数组是因
  • ATL 和 MFC 字符转换宏

    ATL 和 MFC 字符转换宏 ATL3 0 ATL3 0中的W2T T2W等一系列宏很方便 但一定要小心 它们从栈上分配内存 直到调用它的函数返回前 该内存不会被释放 如果在一个循环中 这类宏被你反复调用几万次时 你将不可避免地产生sta