1. OLECHAR
COM是一个语言中立硬件结构中立的模型。因此,它需要一个语言中立、硬件结构中立的文本数据类型。由于不同的平台使用的字符类型不同,所以很难有一种类型能使和COM的需要。所以COM就定义了一种文本数据类型——OLECHAR。在大多数平台上,包括WIN32平台都把OLECHAR解释成WCHAR,而在一些16位操作系统下,如win95, Macintonsh OS, OLECHAR会被解释成CHAR。
OLECHAR:
#if defined(_WIN32) && !defined(OLE2ANSI)
typedef WCHAR OLECHAR;
WCHAR:
#ifndef _MAC
typedef wchar_t WCHAR; // wc, 16-bit UNICODE character
#else
// some Macintosh compilers don't define wchar_t in a convenient location, or define it as a char
typedef unsigned short WCHAR; // wc, 16-bit UNICODE character
#endif
在Win32种,OLECHAR就是wchar_t(16位的Unicode字符)
2. OLECHAR* 和BSTR
当我们使用C/C++定义接口的方法传递字符串的时候或者从接口接受一个字符串的时候,经常会用OLECHAR*,在构建一个OLECHAR*的时候需要用宏OLESTR()把字符串包起来, 告诉编译器该常量的类型为wchar_t。
const OLECHAR * pwsz = OLESTR("Hello");
等价于
const wchar_t * pwsz = L"Hello"
如果我们使用其它语言定义的接口时,字符串经常是BSTR类型。
BSTR是"Basic STRing"的简称,它实际上就是OLECHAR *,
typedef /* [wire_marshal] */ OLECHAR *BSTR;
对于windows系统(32位),可以简单理解为OLECHAR使用的就是Unicode 。OLECHAR串与单字节字符串很类似,是一个以null结尾的buffer。唯一的区别是每个字符占两个字节,而不是一个。
使用以null 结尾的简单字符串在COM component间传递不太方便。因此,标准BSTR是一个有长度前缀和null 结束符的OLECHAR数组。BSTR的前4字节是一个表示字符串长度的前缀。BSTR长度域的值是字符串的字节数,并且不包括0结束符。由于BSTR的前四个字节表示长度,而OLECHAR数组的前四字节表示前两个字符。这种情况下,对于C++程序,如何实现BSTR和OLECHAR数组的交换?答案是COM提供了两个BSTR分配用的API:SysAllocString / SysReallocString。函数返回的指针指向BSTR的第一个字符,而不是BSTR在内存的第一个字节。另外,复制BSTR意味着制作字符串的一个拷贝,不是简单的复制指针,BSTR字符数组内部可以包含嵌入的NULL字符。
不能把BSTR当LECHAR*,OLECHAR*会以NULL为结尾,会把内嵌NULL的BSTR截断。反过来,我们不能把OLECHAR*看作BSTR,虽然他们都指向一个字符数组,但是他前边的四个字节的内容是无效的,也就是BSTR的长度无效。
3. TCHAR
TCHAR 是为了统一多语言编码而设计的。ANSI 是单字符编码,UNICODE 双字节字符编码,UTF-8 三字节字符编码,通过不同的编译选项,生成不同的支持不同编码的程序。例如:程序编译为 ANSI, TCHAR 就是相当于 CHAR,
当程序编译为 UNICODE, TCHAR 就相当于 WCHAR。
4. 字符串的转换
即使我们在程序内部都进行了统一编码。但是,如果涉及到对第三方程序的应用,不可避免的要引起字符处理的混乱。我们希望能够把这些涉外的字符串和程序内部的字符串进行转换。这样可以维护程序的一致性。
ATL提供了一系列的转换宏,在必要的时候他可以在前边提到的字符类型之间进行转换。这些宏的命名使用“<源类型缩写>2<目标类型缩写>”的形式。具体缩写如下所示:
T TCHAR类型指针——LPTSTR
W Unicode wchar类型指针——LPWSTR
A MBCS/ANSI char类型指针——LPSTR
OLE COM OLECHAR类型的指针——LPOLESTR
BSTR COM BSTR类型字符串。
C C/C++中的const修饰符
在宏转换的时候,不可避免的要产生一些临时变量(如字符串长度),这些变量会在栈上分配。
分享到:
相关推荐
python3 实现js中JSEncrypt encrypt方法,rsa模块根据字符串公钥生成加密字符串 使用时直接调用rsa_encrypt(s, pubkey_str)方法就好了,第一个参数为待加密字符串,第二个参数为公钥,返回值为加密后的字符串 其中_...
在JAVA中拼接两个字符串的最简便的方式就是使用操作符”+”了。如果你用”+”来连接固定长度的字符串,可能性能上会稍受影响,但是如果你是在 循环中来”+”多个串的话,性能将指数倍的下降。假设有一个字符串,我们...
SQL截取字符串函数(1、截取从字符串左边开始N个字符 2、截取从字符串右边开始N个字符(例如取字符www.163.com) 3、截取字符串中任意位置及长度 等等)
字符串、字符和正则表达式基本知识,讲述C#中的字符串常见属性和方法。
5.输入的字符串Asc&Unicode或者Hex在内存中的数据呈现。 6.支持托盘,将窗口和任务栏最大限度的节省出来。 使用对象: 1.编程学习的初学者,对字符串以及对应的Hex比较陌生人群。 2.需要对字符串有批量特定输出格式...
输入八进制的数值字符串,空格隔开的,然后点击转换即可。也可以反过来转换。 测试网址: https://forum.tuts4you.com/register/ 开发环境:VS2013 C#
.NET获取Html字符串中指定标签的指定属性的值 本代码为C#获取字符串中Html的指定标签的指定属性的值 ...要获取以上字符串中的img中的src或是a中的href等的值 GetHtmlAttr(tempstr,"img","src")这样就能获取到。
在Java中对于字符串数组的排序,我们可以使用Arrays.sort(String[])方法很便捷的进行排序。例如: String[] arrays = new String[] { gyu, sdf, zf, 大同, 收到, 地方, 三等分, 的人, 反对高铁, 泛代数, 上的投入...
NULL 博文链接:https://gaoquanyang.iteye.com/blog/1522697
NULL 博文链接:https://bijian1013.iteye.com/blog/2259856
Delphi TMemo字符串的查找完全实现 已经完全的解决Delphi TMemo的查找对话框 和 替换对话框 功能 的所有功能 查看 GIF http://images.cnblogs.com/cnblogs_com/xe2011/524919/o_TFindDialog.gif
使用StringFog插件自动对 dex 中的字符串进行加密
判断某字符串中是否包含某字符串的方法 if(strpos('www.idc-gz.com','idc-gz') !== false){ echo '包含'; }else{ echo '不包含'; } PHP strpos() 函数 strpos() 函数返回字符串在另一个字符串中第一次出现的...
在做Labview和tcp通讯的时候,需要发送中文字符串,找了会相关资料,竟然找到了labview提供的现成的字符串到utf8相互转换的vi,整理了一下分享出来,2014环境下目前测试可以直接使用。原文...
根据java正则表达式生成一个随机的字符串,具体可以去一下网站看:https://code.google.com/p/xeger/
2.3. COM中的字符串 - BSTR 与 VARIANT 14 2.4. 字符串包装类 15 2.4.1. CRT类 _bstr_t 15 2.4.2. _variant_t 15 2.4.3. STL类 16 2.4.4. ATL类 CComBSTR 16 2.4.5. ATL类CComVariant 17 2.4.6. ATL转换宏 17 2.4.7....
NULL 博文链接:https://tangkuo.iteye.com/blog/2257112
NULL 博文链接:https://rd-030.iteye.com/blog/2007745
通过创建一个字符串,如:"new com.Test().a(1,2)"然后执行这个字符串,结果为调用了Test对象的a方法返回一个结果.
编写程序完成如下功能:输出字符串“www.google.com”的长度,并分别计算并显示出‘o’ 与‘g’的个数,截取其中“google”进行输出显示。 2、编写程序,尝试用“==”与equals()方法比较“Hello java”与“Hello ...