BSTR 数据类型
来源:互联网 发布:网络银行存在的问题 编辑:程序博客网 时间:2024/05/11 19:57
COM 中除了使用一些简单标准的数据类型外,字符串类型需要特别重点地说明一下。因此 COM 设计者引入了 BASIC 中字符串类型的表示方式---BSTR。BSTR 其实是一个指针类型,它的内存结构是:(输入程序片段 BSTR p = ::SysAllocString(L"Hello,你好");断点执行,然后观察p的内存)
BSTR 内存结构
BSTR 是一个指向 UNICODE 字符串的指针,且 BSTR 向前的4个字节中,使用DWORD保存着这个字符串的字节长度( 没有含字符串的结束符)。因此系统就能够正确处理了。特别需要注意的是,由于BSTR的指针就是指向 UNICODE 串,因此 BSTR 和 LPOLESTR 可以在一定程度上混用,但一定要注意:
有函数 fun(LPCOLESTR lp),则你调用 BSTR p=...; fun(p); 正确
有函数 fun(const BSTR bstr),则你调用 LPCOLESTR p=...; fun(p); 错误!!!
有关 BSTR 的处理函数:
API 函数
说明
SysAllocString()
申请一个 BSTR 指针,并初始化为一个字符串
SysFreeString()
释放 BSTR 内存
SysAllocStringLen()
申请一个指定字符长度的 BSTR 指针,并初始化为一个字符串
SysAllocStringByteLen()
申请一个指定字节长度的 BSTR 指针,并初始化为一个字符串
SysReAllocStringLen()
重新申请 BSTR 指针
CString 函数
说明
AllocSysString()
从 CString 得到 BSTR
SetSysString()
重新申请 BSTR 指针,并复制到 CString 中
CComBSTR 函数
ATL 的 BSTR 包装类。在 atlbase.h 中定义
Append()、AppendBSTR()、AppendBytes()、ArrayToBSTR()、BSTRToArray()、AssignBSTR()、Attach()、Detach()、Copy()、CopyTo()、Empty()、Length()、ByteLength()、ReadFromStream()、WriteToStream()、LoadString()、ToLower()、ToUpper()
运算符重载:!,!=,==,<,>,&,+=,+,=,BSTR
太多了,但从函数名称不能看出其基本功能。详细资料,查看MSDN 吧。另外,左侧函数,有很多是 ATL 7.0 提供的,VC6.0 下所带的 ATL 3.0 不支持。
由于我们将来主要用 ATL 开发组件程序,因此使用 ATL 的 CComBSTR 为主。VC也提供了其它的包装类 _bstr_t。
各种字符串类型之间的转换
1、函数 WideCharToMultiByte(),转换 UNICODE 到 MBCS。使用范例:
LPCOLESTR lpw = L"Hello,你好"; size_t wLen = wcslen( lpw ) + 1; // 宽字符字符长度,+1表示包含字符串结束符 int aLen=WideCharToMultiByte( // 第一次调用,计算所需 MBCS 字符串字节长度 CP_ACP, 0, lpw, // 宽字符串指针 wLen, // 字符长度 NULL, 0, // 参数0表示计算转换后的字符空间 NULL, NULL); LPSTR lpa = new char [aLen]; WideCharToMultiByte( CP_ACP, 0, lpw, wLen, lpa, // 转换后的字符串指针 aLen, // 给出空间大小 NULL, NULL); // 此时,lpa 中保存着转换后的 MBCS 字符串 ... ... ... ... delete [] lpa; 2、函数 MultiByteToWideChar(),转换 MBCS 到 UNICODE。使用范例: LPCSTR lpa = "Hello,你好"; size_t aLen = strlen( lpa ) + 1; int wLen = MultiByteToWideChar( CP_ACP, 0, lpa, aLen, NULL, 0); LPOLESTR lpw = new WCHAR [wLen]; MultiByteToWideChar( CP_ACP, 0, lpa, aLen, lpw, wLen); ... ... ... ... delete [] lpw;
- BSTR 数据类型
- BSTR数据类型
- 关于BSTR数据类型
- 关于BSTR数据类型
- 理解BSTR数据类型 神奇的BSTR
- COM的数据类型BSTR,Variant
- COM的数据类型BSTR,Variant
- 数据类型转换(一)BSTR Char*
- 理解COM字符串数据类型BSTR 、CComBSTR类
- BSTR
- BSTR
- BSTR
- BSTR
- BSTR
- BSTR
- BSTR
- BSTR
- BSTR
- jQuery.fn的作用是什么
- QT输入输出(二) 之 QTextStream 测试
- 删除windows服务中多余的服务项
- service相关知识整理
- “未明确定义列” ibatis的sqlMap中报该
- BSTR 数据类型
- 关于yarn平台下mapreduce运行出现的虚拟内存溢出问题
- TCP 网络拥塞控制
- STM32 startup.s启动文件分析
- js正则表达式反向引用替换字符
- Java NIO——4 在多线程环境下的恶梦之终结
- Search in Rotated Sorted Array
- sed删除行首和行尾空格或者TAB
- 2014年1月2日——上班啦