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 字符转换宏 的相关文章

  • str.translate 与 str.replace - 何时使用哪一个?

    何时以及为什么使用前者而不是后者 反之亦然 目前尚不完全清楚为什么有些人使用前者以及为什么有些人使用后者 它们有不同的目的 translate只能用任意字符串替换单个字符 但一次调用可以执行多次替换 它的参数是一个特殊的表 它将单个字符映射
  • 使用信用卡号的字符串格式

    我正在尝试将信用卡号显示为类似 的字符串 I tried txtbox Text string Format 0 ccNumber 但它不起作用 有任何想法吗 String Format 0 0000 0000 0000 0000 numb
  • case_when 与部分字符串匹配和 contains()

    我正在使用一个数据集 其中有许多名为 status1 status2 等的列 在这些列中 它表示某人是否豁免 完整 注册等 不幸的是 豁免投入并不一致 这是一个示例 library dplyr problem lt tibble perso
  • 对话框上的 EditText 不返回任何文本

    我太累了 找不到错误 我没有发现任何错误 但我没有从 editText 收到任何文本 请看下面的代码 活动密码 xml
  • 检查 PHP 中的字符串长度

    我有一个长度为 141 个字符的字符串 使用下面的代码我有一个if如果字符串大于或小于 140 则语句返回一条消息 libxml use internal errors TRUE dom new DOMDocument dom gt loa
  • 如何从 JavaScript 调用 ASSX?

    我想调用一个 ASHX 文件并从 JavaScript 传递一些查询字符串变量 并将返回字符串获取到 JavaScript 中的字符串中 我该怎么做 ASHX 文件已被编码为response write 一个基于查询字符串的字符串 像这样的
  • 打印“\n”或换行符作为终端输出的一部分

    我正在终端上运行 Python 给定一个字符串string abcd n 我想print它以某种方式使换行符 n in abcd n将是可见的而不是转到下一行 我可以做到这一点而不必修改字符串并添加双斜杠 n Use repr https
  • 如何使用JavaScript估算字符串的磁盘大小?

    我需要尝试估计DISKJavaScript 中文本字符串 可以是原始文本或图像 音频 等的 Base64 编码字符串 的大小 我不知道如何估计这个 当谷歌搜索时我唯一能找到的是 length所以我想 StackOverflow 上也许有人知
  • 更改 GLUT 调用以与 MFC/C++ 一起使用

    我有一个使用 GLUT 进行 OpenGL 渲染的程序 现在我需要它位于 MFC 项目内部 以便它可以与另一个程序组件一起使用 我已经按照这个教程进行操作 http www codeguru com cpp g m opengl openf
  • 根据列中的部分字符串匹配选择数据框行

    我想根据列中字符串的部分匹配从数据框中选择行 例如列 x 包含字符串 hsa 使用sqldf if它有一个like语法 我会做类似的事情 select from lt gt where x like hsa 很遗憾 sqldf不支持该语法
  • 为不带引号的函数获取字符串参数

    我有一个函数 用于从 URL 下载文件并将其写入磁盘 并施加特定的文件扩展名 目前 它看起来像这样 import requests import os def getpml url filename psc requests get url
  • Python 3:将元组转换为字符串

    我有以下代码 var one var two var three 1 var one string one var 1 我需要对其执行以下操作 var four string two var one 但是 这会返回以下错误 TypeErro
  • 如何删除字符串中某个字符之后的所有内容?

    如何删除Python中字符串的某个字符之后的所有内容 例如 我有一个包含文件路径和一些额外字符的字符串 如何删除 zip 后的所有内容 我试过了rsplit and split 但在删除多余字符时都不包含 zip 有什么建议么 只需取出拆分
  • Python bug - 或者我的愚蠢 - 扫描字符串文字时 EOL

    我看不出以下两行之间有显着差异 然而第一个解析 而后者则不解析 In 5 n Axis of Awesome In 6 n Axis of Awesome File
  • 使用 str_replace 使其仅作用于第一个匹配项?

    我想要一个版本str replace 仅替换第一次出现的 search in the subject 有没有一个简单的解决方案 或者我需要一个 hacky 解决方案 虽然没有它的版本 但解决方案一点也不黑 pos strpos haysta
  • C++ 中的转换错误

    有人可以帮我解决这个错误吗 我是 C 新手 看来错误就发生在一堆宏中 我能做什么来解决它 或者我怎样才能追踪到它的源头 我真的不明白这个错误 这是否意味着编译器尝试转换该方法void ReadCPUparameter to a LRESUL
  • 字符串的渐进单词组合

    我需要获得字符串的渐进单词组合 例如 这是字符串 输出 这是字符串 这是 这个字符串 是字符串 这 是 细绳 你知道类似的算法吗 我需要php语言 谢谢 这是解决您问题的简单代码 我将每个字符串递归地连接到数组中的其余字符串 string
  • Cython 函数中的字符串

    我想这样做将字符串传递给 Cython 代码 test py s Bonjour myfunc s test pyx def myfunc char mystr cdef int i for i in range len mystr err
  • Java byte[] 与 String 之间的转换

    为什么这个junit测试失败了 import org junit Assert import org junit Test import java io UnsupportedEncodingException public class T
  • 错误:“字符串”无法转换为“字符串!”

    mapView rac valuesForKeyPath userTrackingMode observer self subscribeNextAs block handling 我收到一个错误 String is not convert

随机推荐

  • 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