日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

VC中BSTR和CString的使用

發(fā)布時間:2025/7/14 c/c++ 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VC中BSTR和CString的使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

BSTR

在頭文件中的定義如下:

typedef WCHAR OLECHAR;

typedef OLECHAR *BSTR;

所以BSTR的實際類型其實就是WCHAR*。

在MSDN中的Allocating and Releasing Memory for a BSTR一文中,強調(diào)了在使用這個類型時,要在內(nèi)存上小心對待,以避免發(fā)生內(nèi)存泄露。對于從函數(shù)中傳出的BSTR,接受的對象要負責對這個BSTR的內(nèi)存進行管理。在該文中列舉了三種情況:

  • 當在一個函數(shù)中使用BSTR時,你要負責分配和銷毀它,代碼如下:

// shows using the Win32 function

// to allocate memory for the string:

BSTR bstrStatus = ::SysAllocString( L"Some text" );

if (bstrStatus == NULL)

?? return E_OUTOFMEMORY;

?

pBrowser->put_StatusText( bstrStatus );

// Free the string:

::SysFreeString( bstrStatus );

//...

?

  • 對于從函數(shù)中返回的BSTR,要在程序中進行釋放

//...

BSTR bstrStatus;

pBrowser->get_StatusText( &bstrStatus );

?

// shows using the Win32 function

// to freee the memory for the string:

::SysFreeString( bstrStatus );

?

如果我們自己定義的函數(shù)返回一個BSTR,那么這個BSTR的接收函數(shù)應該釋放內(nèi)存。

// Example shows using MFC's

// CString::AllocSysString

?

//...

HRESULT CMyClass::get_StatusText( BSTR * pbstr )

{

?? try

?? {

????? //m_str is a CString in your class

????? *pbstr = m_str.AllocSysString( );

????? }

?? catch (...)

?? {

????? return E_OUTOFMEMORY;

?? }

// The client is now responsible for freeing pbstr.

return( S_OK );

}

//...

?

CComBSTR

這一塊兒得內(nèi)容原來看過inside ATL時有提過,但是好像有點忘,有點似是而非。所以在自己確定一下。

??? CComBSTR() throw()

??? {

?????? m_str = NULL;

??? }

如上面代碼所示,對于一個CComBSTR對象,剛創(chuàng)建時會默認初始化的。除了這個構(gòu)造函數(shù)外,還有幾個構(gòu)造函數(shù)

CComBSTR( int nSize)? 用來給CComBSTR初始化分配nSize個對象的空間

CComBSTR(int nSize, LPCOLESTR sz) 從sz中拷貝nSize個字符到CComBSTR中,并且在末尾添加一個null,sz可以包含null字符。

CComBSTR(LPCOLESTR pSrc) 用來拷貝一個null結(jié)尾的字符串。

CComBSTR(REFGUID guid) 將guid轉(zhuǎn)為BSTR存儲在CComBSTR中。

CComBSTR中對賦值運算符進行了重定義,代碼如下:

???????? CComBSTR& operator=(__in const CComBSTR& src)

???????? {

???????????????? if (m_str != src.m_str)

???????????????? {

????????????????????????? ::SysFreeString(m_str);

????????????????????????? m_str = src.Copy();

????????????????????????? if (!!src && !*this)

??????????? {

?????????????????????????????????? AtlThrow(E_OUTOFMEMORY);

??????????? }

???????????????? }

???????????????? return *this;

???????? }

從定義的這個函數(shù)可以看出,在進行賦值時,CComBSTR自己負責釋放之前的內(nèi)存。在使用CComBSTR.Attach時,也會進行相應的操作。

通過CComBSTR的Empty函數(shù)可以進行內(nèi)存的釋放。

?

CString

這個類的詳細介紹我從網(wǎng)上找了一篇博客,挺好的。

http://blog.csdn.net/laiyiling/article/details/125216

轉(zhuǎn)載于:https://www.cnblogs.com/kwliu/archive/2011/07/15/2107805.html

總結(jié)

以上是生活随笔為你收集整理的VC中BSTR和CString的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。