"这篇文档主要讨论了在COM组件编程中如何进行不同类型之间的转换,特别是从BSTR到其他类型的转换和从其他类型到BSTR的转换。文中提到了使用ATL库的方法以及直接调用Windows API函数的方式。" 在COM组件编程中,类型转换是必不可少的一部分,尤其是在处理不同数据类型的接口方法时。`BSTR`是一种在COM中广泛使用的字符串类型,它是Unicode编码的。本篇文档主要探讨了以下几种类型转换方法: 1. **BSTR到其他类型**: - 对于需要转换成非Unicode字符串(如ANSI字符串)的情况,可以使用`WideCharToMultiByte` API函数,将`BSTR`转换为ANSI字符串。首先计算出目标字符串的长度,然后分配内存,最后执行转换。 ```cpp long nLen = WideCharToMultiByte(CP_ACP, 0, inStr, -1, NULL, NULL, NULL, NULL); char* szInStr = new char[nLen]; WideCharToMultiByte(CP_ACP, 0, inStr, -1, szInStr, nLen, NULL, NULL); ``` 2. **其他类型到BSTR**: - 将ANSI字符串转换回`BSTR`,可以使用`SysAllocString` API。首先计算出Unicode字符串的长度,然后分配内存并执行转换。 ```cpp LPOLESTR szNewOleString; szNewOleString = (OLECHAR*)new wchar_t[nAlloc]; MultiByteToWideChar(CP_ACP, 0, szInStr, -1, szNewOleString, nLen); ``` 3. **使用ATL库进行转换**: - ATL库提供了一些方便的类,如`CComBSTR`,可以简化BSTR和其他类型间的转换。例如,将C++字符串转换为`BSTR`只需一行代码。 ```cpp CComBSTR bstrString(szStdString); // Done!! ``` 4. **转换注意事项**: - 在进行字符串转换时,确保正确处理字符串长度,包括添加NULL终止符。 - 在内存分配和释放时,遵循“谁分配谁释放”的原则,避免内存泄漏。 在实际编程中,理解并熟练掌握这些转换方法对于编写高效且无错误的COM组件至关重要。通过适当选择和应用这些技术,开发者可以有效地解决不同数据类型间的互操作性问题。同时,了解和使用ATL库能提高代码的可读性和维护性,因为它提供了更高级别的抽象,减少了对底层API的直接调用。
{
/*
要 求:
com接口传入的参数除了基本的非指针类型(如ing ,long ,bool等),其余的都要使用com特定的类型 --
对于字符串,应该使用BSTR类型,这种类型是一种模糊类型,微软并没有公开内部结构,所有必须使用支持的API去操纵它
其他的还有VARIANT, SAFEARRAY等类型,可以参考资料( ATL或者 VC开发COM组件方面的资料),此处不多说了
相关类型转换:
从BSTR字符串转换到Unicode字符串(例如LPOLESTR)不是必须的,即不需要转换,可以当作一个Unicode字符串使用
从Unicode字符串转换到BSTR字符串必须经过相应的API函数 SysAllocString。
从标准C的字符串转换到Unicode字符串需要使用MultiByteToWideChar函数。
从Unicode字符串转换到标准C的字符串需要使用WideCharToMultiByte函数。
总结:由此可见,使用Unicode字符串当作中介,则可以在标准C的字符串和BSTR字符串之间相互转换!
函数流程:
将传入的字符串 inStr通过转换函数转换成相应的标准C字符串 szInStr,通过标准C的大写转换函数将szInStr转换成大写。
将szInStr通过转换函数转换成BSTR字符串 outStr,作为返回值输出
补 充:
从C标准字符串转换到BSTR字符串,如果在ATL中使用类 CComBSTR,则转换可以相当简化,只需要一行代码
//Convert from char * to BSTR
//
CComBSTR bstrString(szStdString); //Done!!
*/
//以下是不使用 ATL 中的 类,直接使用 API 的方法
//
//得到字符串的长度
//
long nLen = WideCharToMultiByte( CP_ACP, 0, inStr, -1, NULL, NULL, NULL , NULL);
char * szInStr = new char[nLen];
//从 Unicode字符串 转换成 C标准字符串
//
WideCharToMultiByte( CP_ACP , 0, inStr, -1, szInStr , nLen, NULL ,NULL);
//转换成大写
szInStr = strupr(szInStr);
MessageBox(NULL,szInStr,"",MB_OK);
//处理多字符集的最安全的函数是 lstrlen(而不是strlen)
//
nLen = lstrlen(szInStr) + 1; //加 1 的原因是要加上2个结尾为NULL的字符(下一步将乘2使之加倍)
int nAlloc = 2 * nLen;
//分配空间给 Unicode字符串
//
LPOLESTR szNewOleString;
szNewOleString = (OLECHAR *)new wchar_t[nAlloc];
//转换 C标准字符串到 Unicode 字符串
//
MultiByteToWideChar(CP_ACP , 0, szInStr, -1, szNewOleString ,nLen); //注意这里是nLen,而不是nAlloc!!
剩余5页未读,继续阅读
- 粉丝: 0
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- WebLogic集群配置与管理实战指南
- AIX5.3上安装Weblogic 9.2详细步骤
- 面向对象编程模拟试题详解与解析
- Flex+FMS2.0中文教程:开发流媒体应用的实践指南
- PID调节深入解析:从入门到精通
- 数字水印技术:保护版权的新防线
- 8位数码管显示24小时制数字电子钟程序设计
- Mhdd免费版详细使用教程:硬盘检测与坏道屏蔽
- 操作系统期末复习指南:进程、线程与系统调用详解
- Cognos8性能优化指南:软件参数与报表设计调优
- Cognos8开发入门:从Transformer到ReportStudio
- Cisco 6509交换机配置全面指南
- C#入门:XML基础教程与实例解析
- Matlab振动分析详解:从单自由度到6自由度模型
- Eclipse JDT中的ASTParser详解与核心类介绍
- Java程序员必备资源网站大全