`
CanBeatle
  • 浏览: 168745 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

COM中的字符串

    博客分类:
  • C++
阅读更多

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修饰符

在宏转换的时候,不可避免的要产生一些临时变量(如字符串长度),这些变量会在栈上分配。

分享到:
评论

相关推荐

    rf.rar_RF 字符串截取_Rf字符串比较_rf字符串切割

    例如,如果你有一个URL字符串`http://www.pudn.com/downloads123/ebooks/xxx.zip`,你可以用`^http:\/\/www\.pudn\.com`这个正则表达式来截取字符串中与网址相关的部分。匹配结果就是`http://www.pudn.com`。 2. RF...

    labview字符串创建数组

    在LabVIEW中,字符串操作是常见的任务之一,特别是在数据处理和信息传递中。要将单个字符串创建成字符串数组,我们需要了解LabVIEW的基本数据结构和编程方法。以下是一些关于如何在LabVIEW中创建字符串数组的关键...

    impala中substr()截取中文字符串乱码的问题

    5. **使用UDF**:注册成功后,你就可以在Impala SQL查询中使用`substr_udf()`函数了,它会根据你的实现正确处理中文字符串。 需要注意的是,创建UDF时应确保函数的性能尽可能高效,因为Impala中的UDF会在执行时影响...

    jsp页面截取字符串

    - `substring(int beginIndex, int endIndex)`:此方法用于从字符串中提取子字符串。`beginIndex` 是起始位置(包含),`endIndex` 是结束位置(不包含)。 示例: ```jsp String str = "Hello, World!"; ...

    字符串、字符和正则表达式

    例如,频繁使用`+`进行字符串拼接会创建大量中间字符串,此时使用`StringBuilder`类会更高效,因为它允许在内存中动态地构建和修改字符串(性能提示12.2)。 字符在C#中由`char`类型表示,它是单个Unicode字符。...

    常用字符串处理函数-求子字符串,字符串分割,编码转换.

    `indexOf`函数用于查找一个字符串在另一个字符串中的位置。例如,如果我们有字符串`"monkey"`,我们可以使用`indexOf`来查找字符`"m"`或`"key"`的位置。如果子字符串不存在于原字符串中,`indexOf`会返回-1。例如: ...

    JAVA的字符串拼接与性能

    在JAVA中拼接两个字符串的最简便的方式就是使用操作符”+”了。如果你用”+”来连接固定长度的字符串,可能性能上会稍受影响,但是如果你是在 循环中来”+”多个串的话,性能将指数倍的下降。假设有一个字符串,我们...

    instr()函数功能,判断目标字符串是否存在于第一个字符串中

    `instr()` 函数在编程语言中,如VBScript或ColdFusion,是一个非常实用的字符串处理函数,用于在源字符串中查找目标字符串出现的位置。它能够帮助开发者判断目标字符串是否存在于第一个字符串中,并返回目标字符串的...

    python 3 实现js中JSEncrypt encrypt方法,rsa模块根据字符串公钥生成加密字符串

    python3 实现js中JSEncrypt encrypt方法,rsa模块根据字符串公钥生成加密字符串 使用时直接调用rsa_encrypt(s, pubkey_str)方法就好了,第一个参数为待加密字符串,第二个参数为公钥,返回值为加密后的字符串 其中_...

    java 字符串a-z排序

    在Java编程语言中,对字符串中的字符进行a到z排序是一项常见的操作,特别是在处理文本数据或需要对字母顺序排列的场景。本知识点将详细讲解如何实现这个功能。 首先,我们需要理解字符串在Java中的本质。在Java中,...

    C++字符串完全指南—第二部分字符串的封装类

    BSTR是COM接口中常用的一种字符串类型,它结合了Pascal字符串和C风格字符串的特点。BSTR在前面存储长度,同时以空字符结尾,且通常是Unicode格式。尽管BSTR在某些方面提供了便利,但它也有自己的局限性和潜在问题,...

    C++字符串完全指南.rar_C 字符串_字符串_字符串操作_读字符串

    - **访问字符**:可以使用下标操作符`[]`访问字符串中的字符,但要注意,下标从0开始且不能越界。 - **长度获取**:使用`size()`或`length()`方法获取字符串长度,不包括结束的空字符。 - **拼接**:可以使用`+`...

    java统计字符串每个字符出现次数

    在Java编程中,统计字符串中每个字符出现的次数是一个常见的任务,特别是在面试或笔试中作为考察点。这个任务可以通过使用HashMap来实现,因为HashMap提供快速的查找和插入操作,适合处理这种计数的问题。以下是一个...

    Java根据正则表达式生成字符串—Xeger,automaton

    在Java编程语言中,处理字符串和正则表达式是一项常见的任务。正则表达式是一种强大的文本模式匹配工具,可以用于搜索、替换或者提取符合特定规则的字符串。在本篇文章中,我们将深入探讨如何利用Java中的Xeger和...

    字符串转换工具

    在IT行业中,字符串转换工具是一种非常实用的软件,主要用于处理和转换各种字符串数据。这类工具在服务器架设、数据处理、编程开发等多个场景下都扮演着重要角色。下面将详细介绍字符串转换工具及其在服务器架设过程...

    vb字符串分隔与合并的程序实例

    这个函数接受一个字符串和一个分隔符作为参数,返回一个字符串数组,其中每个元素都是原字符串中由分隔符分割出的部分。例如,如果你有一个逗号分隔的数字列表,你可以使用以下代码将其分隔成数组: ```vb Dim ...

    Go-stringish一组可链式字符串助手可减少操纵字符串的痛苦

    - `Replace(old, new)`:替换字符串中的子串。 - `Split(separator)`:根据分隔符切割字符串。 - `Join(strings []string)`:将多个字符串连接成一个。 - `Contains(substring)`:检查字符串是否包含特定子串。 ...

    java实验-字符串.docx

    在Java编程中,字符串是经常使用的数据类型,用于表示文本信息。本实验主要涉及三个方面的内容:字符串的基本操作,字符串的比较以及不同字符串类(String和StringBuffer)的使用和性能分析。 首先,我们来看第一个...

    java中解析json字符串

    本文将深入探讨如何在Java中解析JSON字符串,以满足后端处理前端传递的数据需求。 首先,理解JSON的基本结构至关重要。JSON格式通常包含键值对,可以是对象(用花括号 `{}` 包裹)或数组(用方括号 `[]` 包裹)。...

    C++字符串完全指南

    - **BSTR**: 这是在COM编程中常见的字符串类型,通常用于存储宽字符(Unicode)字符串。BSTR是由ActiveX Data Objects (ADO)和OLE自动化等技术使用的。 - **_tcs**: 这是一种宏前缀,用于创建可以处理不同字符集的...

Global site tag (gtag.js) - Google Analytics