博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ComBSTR的使用
阅读量:7216 次
发布时间:2019-06-29

本文共 2393 字,大约阅读时间需要 7 分钟。

用 CComBSTR 进行编程

Visual Studio .NET 2003
 
3(共 3)对本文的评价是有帮助 
 

ATL 类 CComBSTR 提供对 BSTR 数据类型的包装。尽管 CComBSTR 是一个有用的工具,但有一些情况需要特别小心。

转换问题

虽然一些 CComBSTR 方法自动将 ANSI 字符串参数转换为 Unicode,但这些方法总是返回 Unicode 格式的字符串。若要将输出字符串转换回 ANSI,请使用 ATL 转换类。有关 ATL 转换类的更多信息,请参见 ATL 和 MFC 字符串转换宏

示例

 
 
// Declare a CComBSTR object. Although the argument is ANSI,// the constructor converts it into UNICODE.CComBSTR bstrMyString( "Hello World" );// Convert the string into an ANSI stringCW2CT szMyString( bstrMyString );// Display the ANSI stringMessageBox( NULL, szMyString, _T("String Test"), MB_OK );

如果使用字符串来修改 CComBSTR 对象,请使用宽字符字符串。这会减少不必要的转换。

示例

 
 
// The following converts the ANSI string to UnicodeCComBSTR bstr("Test");// The following uses a Unicode string at compile time CComBSTR bstr(L"Test");

范围问题

与任何功能完善的类一样,CComBSTR 在超出范围时将释放其资源。如果函数返回指向 CComBSTR 字符串的指针,这会引起问题,因为指针将引用已经释放的内存。在这种情况下,请使用Copy 方法,如下所示。

示例

 
 
// The wrong way to do itBSTR * MyBadFunction(){   // Define a pointer to a BSTR   BSTR * bstrStringPtr;   // Create the CComBSTR object   CComBSTR bstrString("Hello World");   // Convert the string to uppercase   bstrString.ToUpper();   // Assign the pointer    * bstrStringPtr = bstrString;   // Return the pointer. ** Bad thing to do **   return bstrStringPtr;}// The correct way to do itHRESULT MyGoodFunction(/*[out]*/ BSTR* bstrStringPtr){   // Create the CComBSTR object   CComBSTR bstrString("Hello World");   // Convert the string to uppercase   bstrString.ToUpper();   // Return a copy of the string.   return bstrString.CopyTo(bstrStringPtr);}

显式释放 CComBSTR 对象

在对象超出范围之前,可以显式释放包含在 CComBSTR 对象中的字符串。如果字符串被释放,则 CComBSTR 对象无效。

示例

 
 
// Declare a CComBSTR objectCComBSTR bstrMyString( "Hello World" );// Free the string explicitly::SysFreeString(bstrMyString);// The string will be freed a second time// when the CComBSTR object goes out of scope,// which is unnecessary.

在循环中使用 CComBSTR 对象

 CComBSTR 类分配缓冲区来执行某些运算时,如 += 运算符或 Append 方法,建议不要在紧密型循环内执行字符串操作。在这种情况下,CStringT 可提供更好的性能。

示例

 
 
// This is not an efficient way// to use a CComBSTR object.CComBSTR bstrMyString;while (bstrMyString.Length()<1000)   bstrMyString.Append(L"*");

内存泄漏问题

将已初始化的 CComBSTR 的地址作为 [out] 参数传递到函数会导致内存泄漏。

在下面的示例中,在函数 OutString 替换为了保存字符串 "Initialized" 而分配的字符串时,该字符串被泄漏。

 
 
CComBSTR bstrLeak(L"Initialized");HRESULT hr = OutString(&bstrLeak);

若要避免泄漏,请在作为 [out] 参数传递地址之前,对现有的 CComBSTR 对象调用 Empty 方法。

请注意,如果函数的参数是 [in, out],则同样的代码将不会导致泄漏

转载地址:http://nluym.baihongyu.com/

你可能感兴趣的文章
蓝云公布2019云生态战略,如何解决企业上云关键问题?
查看>>
FaaS、PaaS和无服务器体系结构的优势
查看>>
Ceylon语言加入Eclipse基金会
查看>>
一文盘点MWC 2019所有5G设备和研发进展
查看>>
【leetcode】85. Maximal Rectangle 0/1矩阵的最大全1子矩阵
查看>>
网站真分页js代码该怎么写?
查看>>
教你五分钟入门使用html5 svg绘制图形
查看>>
vue-concise-slider vue滑动组件
查看>>
ElectronOCR:基于Electron+React+Tesseract的MACOS下的OCR工具
查看>>
Mysql 架构及优化之-定时计划任务
查看>>
不插即用!配备微信网页授权模块的CodeIgniter应用脚手架
查看>>
HBase存储剖析与数据迁移
查看>>
人工智能高考511分,未来有望考上东京大学!
查看>>
O2O业务都跳不出这五大领域
查看>>
呼之欲出的量子计算机和漫长的最后一公里
查看>>
“九”答不可 | 量子保密,完美无缺?
查看>>
VMware备份研究
查看>>
dotnet调用node.js写的socket服务(websocket/socket/socket.io)
查看>>
Nibiru Open Day,OZO 遇见 DigiArtist 国际数字艺术展
查看>>
MySQL · 引擎分析 · InnoDB行锁分析
查看>>